我将一个IEnumerable传递给一个不在ajax post调用上绑定的视图。
我在View中构建了一个迭代来访问一些属性:
@model IEnumerable<MvcNPCA.Models.T_Contact_Medium>
@using (Ajax.BeginForm("Edit", new { medid = ViewBag.medid, cid = ViewBag.cid, parentdiv = ViewBag.parentdiv }, new AjaxOptions { UpdateTargetId = @ViewBag.parentdiv }))
{
for (int count = 0; count < Model.Count(); count++)
{
@Html.HiddenFor(model => model.ElementAt(count).T_Contact_MediumID)
@Html.HiddenFor(model => model.ElementAt(count).MediumGegeven)
}
<table>
<tr>
<th>
Contact
</th>
...
</tr>
@foreach (var item in Model)
{
if (item.T_Contact_MediumID == ViewBag.medid)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Contact.Contactid)
</td>
<td>
@Html.EditorFor(modelItem => item.MediumGegeven)
</td>
</tr>
}
else
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Contact.Contactid)
</td>
<td>
@Html.DisplayFor(modelItem => item.MediumGegeven)
</td>
</tr>
}
}
</table>
<input type="submit" value="Save" />
}
但是在我的控制器中没有模型绑定:
[HttpPost]
public ActionResult Edit(IEnumerable<T_Contact_Medium> t_contact_medium, int medid, int cid, string parentdiv)
{
if (ModelState.IsValid)
{
_service.UpdateMedium(_service.GetMediumByID(medid));
ViewBag.cid = cid;
ViewBag.parentdiv = parentdiv;
ViewBag.MediumId = new SelectList(_MediumEnumService.GetAll(), "MediumId", "Medium1");
var tcrmodel = _service.GetMediumByContactID(cid);
return PartialView("Index",tcrmodel);
}
ViewBag.MediumId = new SelectList(_MediumEnumService.GetAll(), "MediumId", "Medium1");
return PartialView(t_contact_medium);
}
我认为我的控制器部分正确
关于我可能忽略的任何想法?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我遇到的问题有很多可能的解决方案。在我的情况下,我想从IEnumerable构建一个具有一个可编辑行的表
因此,我可以发送单个实体,而不是将完整的IEnumerable模型传递给控制器
我这样做的方法是只通过模型访问可编辑实体。
像这样:
@{var count = 0;}
@foreach (var item in Model)
{
if (item.T_Contact_MediumID == ViewBag.medid)
{
@Html.HiddenFor(model => model.ElementAt(count).T_Contact_MediumID)
@Html.HiddenFor(model => model.ElementAt(count).MediumId)
@Html.HiddenFor(model => model.ElementAt(count).ContactId)
<tr>
<td>
@Html.DisplayFor(model => model.ElementAt(count).Contact.Voornaam)
</td>
<td>
@Html.DisplayFor(model => model.ElementAt(count).Medium.Medium1)
</td>
<td>
@Html.EditorFor(model => model.ElementAt(count).MediumGegeven)
</td>s
<td>
@Html.EditorFor(model => model.ElementAt(count).Login)
@*Html.CheckBoxFor(modelItem => item.Login*@
</td>
<td>
@Html.DisplayFor(model => model.ElementAt(count).Gebruikernaam)
</td>
<td>
<input type="submit" value="opslagen" />
</td>
</tr>
}
else
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Contact.Voornaam)
</td>
<td>
@Html.DisplayFor(modelItem => item.Medium.Medium1)
</td>
<td>
@Html.DisplayFor(modelItem => item.MediumGegeven)
</td>
<td>
@Html.DisplayFor(modelItem => item.Login)
@*Html.CheckBoxFor(modelItem => item.Login*@
</td>
<td>
@Html.DisplayFor(modelItem => item.Gebruikernaam)
</td>
<td>
@Ajax.ActionLink("Edit", "Edit", new { medid = item.T_Contact_MediumID, cid = ViewBag.cid, parentdiv = ViewBag.parentdiv }, new AjaxOptions { UpdateTargetId = ViewBag.parentdiv }) |
@Html.ActionLink("Details", "Details", new { id = item.T_Contact_MediumID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.T_Contact_MediumID })
</td>
</tr>
}
我明白要在控制器上序列化IEnumerable,这样做的一种方法是将您的可能性包装在自定义视图模型中。