2013-05-19 31 views
0

我有一個關於MVC 3和更多關於視圖和模型的陳述的問題。我想提一提,我是MVC的新手,所以我只是在學習它。MVC3註冊表格和型號

基本上例如讓我們TE登記表:

我有一個控制器,視圖和模型,以註冊新用戶。

  • 的AccountController
  • Register.chtml
  • AccountModel => RegisterationModel

現在,登記模型我有所有與數據註解數據成員,例如:

[Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

然後在視圖中渲染。

讓我困擾,否則我真的不知道如何做正確:

好吧,我有RegistrationModel ......但後來,例如,如果我想使用戶的配置文件,應我再次調用registrationmodel或者它將會是profilemodel?所以基本上我會有很多相同的模型來渲染相同的東西......不是?

我不能有一個一般的模型,像用戶,然後用戶我可以通過RegistrationModel/ProfileModel進行查看。

也許理解我的意思有點困難,但我的想法是:例如,用戶提交表單,解析所有內容並用所有數據成員創建User對象,然後將此User對象被提交給DAL,並提交給DB。稍後有人訪問此用戶和DAL的配置文件時,將返回用戶對象,然後將其顯示出來。

回答

1

您的問題的答案是,您通常應該將您的域模型與視圖模型分開。考慮以下情況。假設您有一個用戶模型,並且您的業務邏輯允許您添加新用戶並編輯現有用戶。假設您的用戶模型如下所示:

public class User 
{ 
    [Required] 
    public int? UserId {get; set;} 
    [Required] 
    public string LastName {get; set;} 
    [Required] 
    public string FirstName {get; set;} 
    [Required] 
    public string Password {get; set;} 
    public bool IsAdmin {get; set;} 
} 

現在爲了讓您的用戶模型有效,您必須具有用戶標識才能使用戶可以識別。當你插入一個新用戶時,你不需要這個ID,因爲這是數據庫在插入時會自動處理的東西。但是,當您正在更新用戶時,您需要填寫用戶標識。所以現在你有一個模型,在一種情況下需要一個字段(UserId),但在另一個情況下它不需要。你打算如何處理?

答案是視圖模型,這就是它們存在的原因,以及爲什麼建議爲您的項目中的每個表單創建一個表單。在這種情況下,您最終將得到一個不同的插入和更新用戶視圖模型。我知道將這些視圖模型轉換爲底層域模型非常繁瑣,但有些庫可以幫助您像AutoMapper(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started)那樣自動完成此操作。

第二個也許更嚴重的問題是發佈。假設您正在使用上述用戶模型來編輯數據庫中的用戶。現在模型有一個IsAdmin字段,它指定用戶是否是管理員。現在,您的編輯用戶視圖將省略此字段,因爲您不希望普通用戶能夠使自己成爲管理員。但是,假設你正在處理一個非常聰明的用戶,他做出一個隱藏字段IsAdmin的ID,並使其價值是真實的:

<input type="hidden" id="IsAdmin" value="true" /> 

,然後他/她發佈的形式向您節省用戶的網址。由於您使用的是具有IsAdmin屬性的域邏輯用戶模型,因此此隱藏字段將映射到您的模型,並且此用戶只是設法讓您自己和管理員在您的網站中進行操作。這正是您需要視圖模型的原因,所以這種情況永遠不會發生。

+0

所以基本上你在說什麼,我將不得不擁有RegistrationModel和ProfileModel以及一般的用戶類..? – Alnedru

+0

基本上是的,這是最好的做法。你可能有你不需要的實例,1個模型就足夠了,但是一般來說,你應該使用視圖模型來爲你的視圖輸入表單。 – Marko

+0

這是另一個關於這個問題的好文章:http://www.howmvcworks.net/OnModelsAndViewModels/ToModelOrViewModel – Marko