通过迭代访问后,Ienumerable为null

时间:2012-04-16 09:54:37

标签: asp.net-mvc asp.net-mvc-3

我将一个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,这样做的一种方法是将您的可能性包装在自定义视图模型中。

0 个答案:

没有答案