2011-10-13 48 views
0

我有一個Person模型和一個學生模型。學生模型有2個PersonID的FK;一個給學生,另一個給父母。MVC中強類型視圖的自定義條件驗證

我的看法是這樣的:

@Html.EditorFor(m => m.student.Person.FirstName) 
    @Html.EditorFor(m => m.student.Person.DOB) 

    @Html.EditorFor(m => m.student.Father.FirstName) 

的車型應該是這樣的:

public partial class Person 
    { 
    public int PersonID { get; set; } 

    [Required] 
    [PlaceHolder("First Name")] 
    public string FirstName { get; set; } 

    [PlaceHolder("Birth Date")] 
    public Nullable<System.DateTime> DOB { get; set; } 
    } 


public partial class Student 
{ 
    public int Student_PersonID { get; set; } 
    public int Parent_PersonID { get; set; } 
} 

我想DOB被要求現場的學生,但不是父。如果我將[Required]屬性添加到DOB元素,那麼它對兩者都有要求。有沒有辦法可以在視圖上設置需要的字段?或者有沒有在模型中使用驗證屬性來做到這一點?

僅供參考...我使用EF數據庫第一種方法

感謝

回答

0

一種方法是使從人繼承的PersonRequired類。將元數據類添加到PersonRequired,以便擁有PersonRequiredMetaData,並在該特定情況下需要繼承的DOB字段。您需要手動複製Person和PersonRequired類之間的值或使用AutoMapper。我希望有比這更好的答案!

另一種選擇是使用FluentValidation,它可以讓您與模型分開進行驗證(不使用數據註釋)。我想知道有些人是否使用數據註釋來滿足數據庫需求以及對程序化需求的流暢驗證。

2

我建議讓視圖模型與視圖中顯示的字段匹配。如果稍後要從視圖中刪除某個字段,則該字段也將從域模型中刪除。

在這種情況下,如果你的觀點是,以顯示以下字段:

  • StudentFirstName
  • StudentDOB
  • ParentFirstName
  • ParentDOB

那麼我會建議有以下查看:

public class PersonViewModel 
{ 
    public int StudentPersonID { get; set; } 

    [Required] 
    public string StudentFirstName { get; set; } 

    [Required] 
    public DateTime StudentDOB { get; set; } 

    public int ParentPersonID { get; set; } 

    [Required] 
    public string ParentFirstName { get; set; } 

    public DateTime ParentDOB { get; set; } 
} 

或者相反,如果你有2個獨立的顯示觀點:

  • StudentFirstName
  • StudentDOB

,並顯示:

  • ParentFirstName
  • ParentDOB

,那麼我建議有2個獨立的視圖模型:

public class StudentViewModel 
{ 
    public int StudentPersonID { get; set; } 

    [Required] 
    public string StudentFirstName { get; set; } 

    [Required] 
    public DateTime StudentDOB { get; set; } 
} 

public class ParentViewModel 
{ 
    public int ParentPersonID { get; set; } 

    [Required] 
    public string ParentFirstName { get; set; } 

    public DateTime ParentDOB { get; set; } 
} 

以這種方式使用的視圖模型將允許您使用[要求]數據註解爲需要他們,而不是試圖領域創建一個解決方法。請注意,視圖模型不應與域模型混淆,因此這些數據將需要映射到域模型。

希望這會有所幫助。

如果你的應用程序是一個簡單的應用程序,你可能不需要創建一個單獨的業務邏輯層,大多數書籍只提供簡單模型的MVC可能沒問題。但是,如果你搜索你周圍的人也會發現,開發人員建議從商業模式有一個視圖模型單獨的其他例子,如this

我也建議閱讀Wrox Professional Enterprise .Net 2009其中的章節7 & 8給人以討論業務層的很好的例子交易腳本模式,活動記錄模式和域模型模式。

+0

你知道任何很好的教程/博客解釋使用視圖模型 - 領域模型場景嗎?謝謝 – imran

+0

我已經更新了回答你的問題的答案。 – Dangerous