嵌套的MVC3模型既不验证也不绑定

时间:2012-01-23 00:48:05

标签: asp.net-mvc-3 validation model-binding

我有一个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。所有这些都是。你如何做这种嵌套的模型绑定?我认为这样可行。

1 个答案:

答案 0 :(得分:1)

如果查看生成的HTML,原因很明显。每个项目具有相同的ID和相同的名称。模型绑定器没有简单的方法来判断哪个是哪个。

这是局部视图和模板之间差异的一个主要示例。模板有额外的逻辑来处理这种情况。

您应该创建一个SecretQuestionAndAnswerModel模板并使用

@EditorFor(x => x.SecretQuestion1)

如果您不确定模板的工作原理,请阅读:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html