オブジェクトの子コレクション(外部キー制約、子オブジェクトのコレクションを使用したEF)の更新で問題が発生しました。これは、次のガイドを使用して解決されました: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/これ は2つのことで私を助けます1 。インデックスはシーケンシャル0ベースの整数系列ではなくなり、アイテムを並べ替えたり、シーケンスを壊すことを心配せずに追加/削除したりできます。2.パーシャルはコンテキストを失ったようで、私のコントロールは「CaptureAttendeeInformationField[0].Required」であるはずの「[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;
}
}
}
私はそれがまったく好きではありませんが、それは機能します。これを行うためのより良い方法があるはずです。