0

有太多人告诉我应用required课程来完成所需的领域。我不希望好ol'required属性;我想要新的属性集进行验证。这是我一直没有成功尝试:如何将jQuery不显眼的验证应用于DropDownList编辑器模板?

这是我的编辑模板:

@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

只需使用所需的属性验证,装点相应的视图模型属性。例如:

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 - ") 

这将确保助手始终发出验证属性。

相关问题