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

這將確保助手始終發出驗證屬性。

相關問題