我有一个RegisterModel,由5个SecretQuestionAndAnswerModel模型组成
public class RegisterModel
{
public SecretQuestionAndAnswerModel SecretQuestion1 { get; set; }
public SecretQuestionAndAnswerModel SecretQuestion2 { get; set; }
public SecretQuestionAndAnswerModel SecretQuestion3 { get; set; }
public SecretQuestionAndAnswerModel SecretQuestion4 { get; set; }
public SecretQuestionAndAnswerModel SecretQuestion5 { get; set; }
}
和
public class SecretQuestionAndAnswerModel
{
public SecretQuestionTypeModel Type { get; set; }
[Required(ErrorMessage = "Please choose a question.")]
public int Id { get; set; }
public string Question { get; set; }
[Required]
[StringLength(20)]
public string Answer { get; set; }
[Display(Name = "Select Question")]
public IEnumerable<SelectListItem> DefaultQuestions { get; set; }
}
在我的主Register.cshtml上,我包含了这样的每个问题:
@Html.Partial("_QuestionAndAnswer", Model.SecretQuestion1, new ViewDataDictionary { { "Index", 1 }})
,部分看起来像:
<div class="input">
@{
@Html.DropDownListFor(m => Model.Id, Model.DefaultQuestions, "(Please choose one)")
@Html.ValidationMessageFor(m => Model.Id)
@Html.TextBoxFor(m => m.Answer)
@Html.ValidationMessageFor(m => m.Answer)
}
</div>
但是在验证时,所有5个问题都表现为一个:换句话说,如果我选择一个问题并输入第一个秘密问题的答案,那么它们都会通过验证,反之亦然。
此外,在发布到HttpPost Register方法
时public ActionResult Register(RegisterModel model) { ...
model.SecretQuestion1始终为null。所有这些都是。你如何做这种嵌套的模型绑定?我认为这样可行。
答案 0 :(得分:1)
如果查看生成的HTML,原因很明显。每个项目具有相同的ID和相同的名称。模型绑定器没有简单的方法来判断哪个是哪个。
这是局部视图和模板之间差异的一个主要示例。模板有额外的逻辑来处理这种情况。
您应该创建一个SecretQuestionAndAnswerModel模板并使用
@EditorFor(x => x.SecretQuestion1)
如果您不确定模板的工作原理,请阅读:
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html