如何将jQuery unobtrusive验证应用于DropDownList编辑器模板?

时间:2013-01-19 19:08:44

标签: asp.net-mvc asp.net-mvc-4 jquery-validate unobtrusive-validation

太多人告诉我应用required课程来填补所需的字段。我不想要好的'required属性;我想要新的属性集进行验证。这是我试过没有成功的原因:

这是我的编辑模板:

@using Comair.RI.UI.Core
@{
    var list = this.GetModelSelectList();
    var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@if (ViewData.ModelMetadata.IsRequired)
{
    //var att = "data-val-required=\"string.Format("The {0} field is required", ViewData.ModelMetadata.DisplayName)
    var att = string.Format("The {0} field is required.", ViewData.ModelMetadata.DisplayName);
    @Html.DropDownListFor(m => Model, listWithSelected, " - select - ", 
    new Dictionary<string, object> {{"data-val-number=", "The field " + ViewData.ModelMetadata.DisplayName + " must be a number."}, {"data-val", true}, {"data-val-required", att}})
}

1 个答案:

答案 0 :(得分:1)

使用所需的验证属性简单地修饰相应的视图模型属性。例如:

public class Core
{
    [Required]
    public int? Id { get; set; }
}

然后:

@using Comair.RI.UI.Core
@{
    var list = this.GetModelSelectList();
    var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@if (ViewData.ModelMetadata.IsRequired)
{
    @Html.DropDownListFor(m => m.Id, listWithSelected, " - select - ")
}

另请注意,传递给DropDownListFor帮助器的第一个参数必须表示指向简单标量属性类型(例如整数或字符串)的lambda表达式。这就是为什么在我的示例中我已经说明了如何将Required属性应用于视图模型上的相应Id属性,然后简单地将DropDownList绑定到它。然后帮助程序将生成所有必要的属性,以便进行不显眼的验证。在您的示例中,您将下拉列表绑定到具有m => Model的模型,该模型首先是一个不正确的lambda表达式,因为您从外部捕获Model值,更糟糕的是它是一个复杂类型,不是很与助手兼容。

你应该注意一件事。如果未在表单(Html.BeginFormAjax.BeginForm)内调用此模板,则帮助程序将不会发出客户端验证属性,例如data-required等。您可以通过实例化FormContext(如果不存在)来解决此问题:

@if (ViewContext.FormContext == null)
{
    ViewContext.FormContext = new FormContext();
}
@Html.DropDownListFor(m => m.Id, listWithSelected, " - select - ")

这将确保帮助程序始终发出验证属性。