1

ajax post 呼び出しにバインドしないビューに IEnumerable を渡します。

ビューで反復を構築して、いくつかのプロパティにアクセスしました。

@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);
    }

コントローラの部分は正しいと思います。
私が見落としていた可能性のあるものについてのアイデアはありますか?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

私が抱えていた問題には、多くの可能な解決策があります。私の場合、1 つの編集可能な行を持つ 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 をシリアル化するには、これを行う 1 つの方法は、カスタム ビュー モデルで ienumerable をラップすることです。

4

0 に答える 0