0

太多人告诉我申请该required课程以使该领域成为必填项。我不想要好的 ol'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}})
}
4

1 回答 1

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

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

于 2013-01-22T11:04:57.253 回答