Как связать параметр типа "Словарь" для действий 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" />
}
Любая идея будет очень ценится!
2 ответа
Не используйте словарь для этого. Они плохо играют с привязкой модели. Может быть PITA.
Модель представления была бы более подходящей:
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>
Взгляните на этот пост Скотта Хансельмана. Здесь приведены примеры привязки модели к словарю, спискам и т. Д.