次のコードはかなり削除されていますが、基本的に私が達成しようとしているのは次のとおりです。
ページから質問/回答の選択肢を動的に追加/削除できるようにしながら、質問とそれに含まれる回答の選択肢を編集できるようにしたいと考えています。理想的には、アイテムの HtmlFieldPrefix はノンシーケンシャルですが、Html.EditorFor() はシーケンシャル インデックスを使用します。
回答の選択肢の IEnumerable を含む Question ViewModel があります。
public class QuestionViewModel
{
public int QuestionId { get; set; }
public IEnumerable<AnswerChoiceViewModel> AnswerChoices { get; set; }
}
私の質問の部分ビュー (Question.ascx) には、次のようなものがあります。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.QuestionViewModel>" %>
<%=Html.HiddenFor(m => m.QuestionId)%>
<%=Html.EditorFor(m => m.AnswerChoices) %>
Answer Choice エディター テンプレート (AnswerChoiceViewModel.ascx):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.AnswerChoiceViewModel>" %>
<%=Html.HiddenFor(m => m.AnswerChoiceId)%>
<%=Html.TextBoxFor(m => m.Name)%>
Question.ascx をレンダリングすると、出力は次のようになります。
<input type="hidden" id="QuestionId" value="1" />
<input type="hidden" id="Question.AnswerChoices[0].AnswerChoiceId" value="1" />
<input type="hidden" id="Question.AnswerChoices[0].Name" value="Answer Choice 1" />
<input type="hidden" id="QuestionId" value="2" />
<input type="hidden" id="Question.AnswerChoices[1].AnswerChoiceId" value="2" />
<input type="hidden" id="Question.AnswerChoices[1].Name" value="Answer Choice 2" />
私が知りたいのは、ページが次のようにレンダリングされるように、EditorFor にカスタム GUID インデックスを提供する方法です。
<input type="hidden" id="QuestionId" value="1" />
<input type="hidden" id="Question.AnswerChoices[e1424d5e-5585-413c-a1b0-595f39747876].AnswerChoiceId" value="1" />
<input type="hidden" id="Question.AnswerChoices[e1424d5e-5585-413c-a1b0-595f39747876].Name" value="Answer Choice 1" />
<input type="hidden" id="QuestionId" value="2" />
<input type="hidden" id="Question.AnswerChoices[633db1c3-f1e6-470b-9c7f-c138f2d9fa71].AnswerChoiceId" value="2" />
<input type="hidden" id="Question.AnswerChoices[633db1c3-f1e6-470b-9c7f-c138f2d9fa71].Name" value="Answer Choice 2" />
現在のコンテキストのプレフィックス インデックスを取得し、それを非表示の ".Index" フィールドに格納するヘルパー メソッドを既に作成して、非連続インデックスを正しくバインドできるようにしました。EditorFor がどのようにインデックスを割り当てているかを知りたいだけなので、それをオーバーライドできます (または他の実用的なソリューション)。