在局部视图中编辑集合

时间:2012-05-08 07:00:35

标签: asp.net-mvc-3 entity-framework-4.3 ef-migrations

我在更新使用本指南解决的对象(Foreign key constraint, EF with collection of childobjects)的子集合时出现问题:http://www.codetuning.net/blog/post/Binding-Model-Graphs-with-ASPNETMVC.aspx

清理代码时,我将集合编辑移到了部分视图。

@Html.Partial("_AttendeeInformationFields", Model.CaptureAttendeeInformationFields)

部分视图如下所示

@model ICollection<EventModel.Models.AttendeeInformationField>
<table id="CaptureAttendeeInformationFields">
    <tr>
        <th>@Html.GetDisplayName(model => model.FirstOrDefault().Name)</th>
        <th>@Html.GetDisplayName(model => model.FirstOrDefault().Required)</th>
        <th>@Html.GetDisplayName(model => model.FirstOrDefault().FieldType)</th>
        @*<th>@Html.GetDisplayName(model => model.FirstOrDefault().InputType)</th>*@
    </tr>
    @Html.EditorForModel()
</table>
@Html.LinkToAddNestedForm("Lägg till", "#CaptureAttendeeInformationFields", ".AttendeeInformationField", "CaptureAttendeeInformationFields", typeof(EventModel.Models.AttendeeInformationField))
@Html.ValidationMessageFor(model => model)

然后我有一个看起来像这个

的AttendeeInformationField的EditorTemplate
@model EventModel.Models.AttendeeInformationField
<tr class="AttendeeInformationField">
@using (Html.BeginCollectionItem("CaptureAttendeeInformationFields"))
{
    <td>@Html.TextBoxFor(model => model.Name) @Html.HiddenFor(model => model.MagnetEventId) @Html.HiddenFor(model => model.Id)</td>
    <td>@Html.CheckBoxFor(model => model.Required)</td>
    <td>@Html.DropDownListFor(model => model.FieldType, new SelectList(Enum.GetValues(typeof(EventModel.Models.FieldType)), Model.FieldType))</td>
    @*<td>@Html.TextBoxFor(model => model.InputType)</td>*@
}
</tr>

BeginCollectionItem来自本指南:http://ivanz.com/2011/06/16/editing-variable-length-reorderable-collections-in-asp-net-mvc-part-1/ 这有助于我做两件事 1.索引不再是基于0的顺序整数系列,我可以重新排序我的项目,以及添加/删除而不必担心破坏序列。 部分似乎松开了上下文,我的控件得到的名称如“[0] .Required”,它应该是“CaptureAttendeeInformationField [0] .Required”。 BeginCollectionItem负责处理这个问题。

目前的问题是这些修复似乎不兼容。我想这可能与第一篇文章中的免责声明有关:

  

在此实现中,我们假设索引是一个从0开始的整数

我希望有人能指出我正确的方向。 在此解决方案中添加项目可以正常工作。

丑陋的解决方案 我当然希望这不是唯一的方法,但是现在我已经解决了这个问题:

foreach (var attendeeInformationField in viewModel.AttendeeInformationFields)
        {
            var attendeeInformationFieldId = attendeeInformationField.Id;
            var originalAttendeeInformationField = original.CaptureAttendeeInformationFields.FirstOrDefault(aif => aif.Id == attendeeInformationFieldId);
            if (originalAttendeeInformationField==null)
            {
                original.CaptureAttendeeInformationFields.Add(attendeeInformationField);
            }
            else
            {
                if (originalAttendeeInformationField != attendeeInformationField)
                {
                    originalAttendeeInformationField = attendeeInformationField;
                    originalAttendeeInformationField.FieldType = attendeeInformationField.FieldType;
                    //originalAttendeeInformationField.InputType = attendeeInformationField.InputType;
                    originalAttendeeInformationField.Name = attendeeInformationField.Name;
                    originalAttendeeInformationField.Required = attendeeInformationField.Required;
                }
            }
        }

我根本不喜欢它,但它有效。必须有更好的方法来做到这一点。

0 个答案:

没有答案