0

有觸發客戶端驗證通過DropDownListFor創建的選擇列表的方法嗎?由助手創建的選擇列表似乎沒有獲得文本輸入獲得的用於客戶端驗證的「data-val」或「data-val-required」屬性。ASP.net MVC3 DropDownListFor INT要求DataAnnotation

驗證並在服務器側出現當我檢查ModelState.IsValid,然後對後續頁面加載顯示的驗證消息。

我就行了,因爲我希望用戶必須選擇一個選項(而不是讓它在列表中選擇第一項)中設置的默認選項「請選擇...」。

我的視圖模型:

public partial class ProvinceVM 
{ 
    [Required] 
    [Range(1, int.MaxValue)] 
    public int CountryId { get; set; } 
    [Required] 
    [StringLength(16)] 
    public string Abbreviation { get; set; } 
    [Required] 
    [StringLength(64)] 
    public string Name { get; set; } 
} 

在查看代碼:

<div class="editor-label"> 
    @Html.LabelFor(model => model.CountryId, "Country") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.CountryId, "Please Select...") 
    @Html.ValidationMessageFor(model => model.CountryId) 
</div> 

我的控制器代碼:

[HttpPost] 
public ActionResult Create(ProvinceEditVM provinceVM) 
{ 
    if (ModelState.IsValid) 
    { 
     var province = new Province() { CountryId = provinceVM.CountryId.Value, Abbreviation = provinceVM.Abbreviation, Name = provinceVM.Name }; 
     _repo.Add<Province>(province); 
     _repo.SaveChanges(); 
     return RedirectToAction("index"); 
    } 
    ViewBag.CountryId = new SelectList(_repo.GetQuery<Country>().OrderBy(x => x.Name), "CountryId", "Name", provinceVM.CountryId); 
    return View(provinceVM); 
} 

事情我已經嘗試:

  • 使視圖模型的CountryId屬性可空INT(INT?)
  • 拆除範圍屬性爲CountryId財產
  • 重命名ViewBag.CountryId別的東西(如果存在與視圖模型的屬性名有些衝突)

我可以很容易地使用jQuery創建所需的值,但我想確保我不會忽略已經內置的東西;特別是因爲更進一步,我想添加本地化的文化錯誤消息。

回答

1

居然能得到它的工作做的我在帖子的末尾提到的所有三件事情的組合。使視圖模型的屬性可以爲空,必需,並且必須將ViewBage.CountryId重命名爲其他內容(我將其重命名爲CountryList)。

我想通了通過添加的SelectList屬性我ProvinceVM把它弄出來的ViewBag的,然後突然的數據-VAL *屬性被顯示在列表上起來。

1

這是dropdownlists不顯眼驗證的錯誤。 MVC 3 RTM不會爲一組下拉列表創建不顯眼的驗證。見http://aspnet.codeplex.com/workitem/7629。問題是構建不顯眼驗證的代碼在不引用元數據的情況下進行調用,從而導致它返回空值。解決方案是爲DropDownListFor構建您自己的HtmlHelper。

看那附帶的zip文件的解決方法,

+0

感謝您指出了這一點。 – Sam 2011-12-18 07:27:04