Как связать параметр типа словаря для действий GET и POST в ASP.NET MVC

Я хочу определить представление, которое отображает список меток и флажков, пользователь может изменить флажок, а затем отправить обратно. У меня проблема с отправкой обратно словаря. То есть параметр словаря для метода post имеет значение null.

Ниже приведены методы действий для действий GET и POST:

 public ActionResult MasterEdit(int id)
        {

            Dictionary<string, bool> kv = new Dictionary<string, bool>()
                                            {
                                                {"A", true},
                                                {"B", false}
                                            };

            return View(kv);
        }


        [HttpPost]
        public ActionResult MasterEdit(Dictionary<string, bool> kv)
        {
            return RedirectToAction("MasterEdit", new { id = 1 });
        }

Beliw это вид

@model System.Collections.Generic.Dictionary<string, bool>
@{
    ViewBag.Title = "Edit";
}
<h2>
    MasterEdit</h2>

@using (Html.BeginForm())
{ 

    <table>
        @foreach(var dic in Model)
        { 
            <tr>
                @dic.Key <input type="checkbox" name="kv" value="@dic.Value"  />
            </tr>


        }
    </table>


   <input type="submit" value="Save" />
}

Любая идея будет очень признательна!


person Pingpong    schedule 28.07.2011    source источник


Ответы (2)


Не используйте для этого словарь. Они плохо работают с привязкой модели. Может быть ПИТА.

Модель представления была бы более подходящей:

public class MyViewModel
{
    public string Id { get; set; }
    public bool Checked { get; set; }
}

затем контроллер:

public class HomeController : Controller
{
    public ActionResult Index() 
    {
        var model = new[]
        {
            new MyViewModel { Id = "A", Checked = true },
            new MyViewModel { Id = "B", Checked = false },
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<MyViewModel> model)
    {
        return View(model);
    }
}

затем соответствующий вид (~/Views/Home/Index.cshtml):

@model IEnumerable<MyViewModel>

@using (Html.BeginForm())
{
    <table>
        <thead>
            <tr>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @Html.EditorForModel()
        </tbody>
    </table>
    <input type="submit" value="Save" />
}

и, наконец, соответствующий шаблон редактора (~/Views/Home/EditorTemplates/MyViewModel.cshtml):

@model MyViewModel
<tr>
    <td>
        @Html.HiddenFor(x => x.Id)
        @Html.CheckBoxFor(x => x.Checked)
        @Html.DisplayFor(x => x.Id)
    </td>
</tr>
person Darin Dimitrov    schedule 28.07.2011
comment
Дарин Димитров, спасибо за совет. зачем нам два идентификатора в MyViewModel.cshtml? - person Pingpong; 28.07.2011
comment
@Pingpong, один из них должен отображать его как текст, а другой - как скрытое поле, чтобы он отправлялся на сервер при обратной передаче, чтобы модель представления была правильно заполнена. - person Darin Dimitrov; 28.07.2011
comment
Спасибо за совет. Оно работает. Что, если данные, переданные для просмотра из контроллера, являются пользовательским типом, содержащим коллекцию. Спасибо! - person Pingpong; 12.08.2011
comment
Я нашел это: jarrettmeyer.com/post/ 2995732471/ - person Pingpong; 12.08.2011

Взгляните на это сообщение Скотта Хансельмана. Есть примеры привязки модели к словарю, спискам и т.д.

person archil    schedule 28.07.2011