2013-11-02 51 views
0

我正在閱讀教程並試圖習慣使用ViewModels和驗證。我不確定驗證是在主模型還是視圖模型上進行,我假設它將在ViewModel上。但是,如果我試圖繼承一個類屬性,那麼在ViewModel上添加驗證似乎沒有意義,所以我將它留在模型本身上,但錯誤沒有顯示出來。模型可能效率低下,需要重新安排一下?驗證模型或視圖模型?

NameModel

public class name { 
     [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)] 
     public string first { get; set; } 
     public string middle { get; set; } 
     [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)] 
     public string last { get; set; } 
     public string otherstuffnotneededontheview { get; set; } 
} 

RegisterViewModel

public class RegisterViewModel { 
    public name fname { get; set; } 
    public name lname { get; set; } 
} 

查看

@model Project.ViewModels.RegisterViewModel 

@using (Html.BeginForm()) 
{ 
    <label> 
    @Html.TextBoxFor(model => model.fname.first) 
    @Html.ValidationMessageFor(model => model.fname.first) 
    </label> 

    <label> 
    @Html.TextBoxFor(model => model.lname.last) 
    @Html.ValidationMessageFor(model => model.lname.last) 
    </label> 
    <input type="submit" /> 
} 

控制器

public ActionResult Register() 
{ 
     RegisterViewModel model = new RegisterViewModel(); 
     return View(model); 
} 

[HttpPost] 
public ActionResult Register(RegisterViewModel model) 
{ 
     return View(model); 
} 

回答

6

所有驗證都需要在ViewModel上完成。

在你的情況的RegisterViewModel是相關聯public ActionResult Register()視圖,這意味着,該視圖返回一個RegisterViewModel對象不是name對象的數據表示。

ModelState.IsValid檢查驗證視圖的輸入[Register.cshtml]針對它被綁定到[RegisterViewModelname]

因此,只有施加到RegisterViewModel的屬性將被驗證的類型。

所以你需要在ViewModel中執行驗證。

這匝提供你的能夠使用不同驗證規則不同的ViewModels(儘管的ViewModels被綁定到相同的基礎模型)額外的靈活性

編輯:(帶有碼建議)

沒有驗證規則應用到模型屬性

public class name { 
     public string first { get; set; } 
     public string middle { get; set; } 
     public string last { get; set; } 
     public string otherstuffnotneededontheview { get; set; } 
} 

它們在視圖模型應用,而不是

public class RegisterViewModel { 
    [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)] 
    public string fname { get; set; } 
     [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)] 
    public string lname { get; set; } 
} 

這種變化應該是非常不夠(猜你正確地結合RegisterViewModelname