意見
@model Survey.Models.TakeSurveyViewModel
@{
Layout = "~/Views/Shared/_SiteLayout.cshtml";
}
<h2>SURVEY : @Model.Title</h2>
<h3>@Model.Description</h3>
<hr />
@using (Html.BeginForm("SubmitSurvey", "HomePage", FormMethod.Post, new { id = "surveyForm" }))
{
for (int index = 0; index < Model.SurveyQuestions.Count; index++)
{
@* Editor Template - Null result *@
@*SurveyQuestionModel item = Model.SurveyQuestions[index];
@Html.EditorFor(x => item);*@
<p>@Model.SurveyQuestions[index].QuestionText</p>
@Html.DropDownListFor(item => Model.SurveyQuestions[index].OptionId, new SelectList(Model.SurveyQuestions[index].Options, "OptionId", "OptionText"), string.Empty)
}
<input type="submit" value="SubmitSurvey" />
}
ビューモデル
public class TakeSurveyViewModel
{
public string Title { get; set; }
public string Description { get; set; }
public int SurveyId { get; set; }
public List<SurveyQuestionModel> SurveyQuestions { get; set; }
public TakeSurveyViewModel() { }
public TakeSurveyViewModel(int surveyId)
{
//Populate data - works ok.
}
}
DropDownList モデル
public class SurveyQuestionModel
{
public int QuestionId { get; set; }
public string QuestionText { get; set; }
[Required(ErrorMessage = "Please select an option.")]
public int OptionId { get; set; }
public IEnumerable<QuestionOption> Options { get; set; }
}
ページは正常にレンダリングされ、すべてのドロップダウンに正しいオプションが表示されます。各選択の ID と名前も一意です -
id="SurveyQuestions_3__OptionId" name="SurveyQuestions[3].OptionId"
コントローラ アクション
[HttpPost]
public ActionResult SubmitSurvey(TakeSurveyViewModel model)
{
return !ModelState.IsValid ? TakeSurvey(model.SurveyId) : null;
}
しかし、送信ボタンをクリックすると、コントローラーのアクション モデルが null になります。
編集: 2x HTML.BeginForm を削除しました
編集 2: SurveyQuestions にパブリック セッターが追加されました。問題はまだ残っているようです。この画像を見てください: