2013-04-11 107 views
0

使用MVC3,c#使用部分類擴展類

我在想模型,類,數據庫表和部分類的「層次結構」。

在DB我有一個UserAccount表結構爲:

USERACCOUNT:用戶ID,名字,姓氏,登錄名,密碼,電子郵件

在項目中,我有一個名爲的usermodel模型。我正在使用它,所以我可以用dataannotations裝飾屬性。它被設置爲元數據類型爲useraccount類,像這樣:在數據庫表

[MetadataType(typeof(UserModel))] 
public partial class useraccount 
{ 
} 

public class UserModel 
{ 
    public int UserId { get; set; } 

    [Display(Name="First Name")] 
    [StringLength(20)] 
    [Required] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [StringLength(30)] 
    [Required] 
    public string LastName { get; set; } 

    [Display(Name = "Email Address")] 
    [StringLength(20)] 
    [Required] 
    public string email { get; set; } 

    [Remote("IsUserNameAvailable", "Validation")] 
    [Display(Name = "Choose a Login Name")] 
    [StringLength(40)] 
    [Required] 
    public string login { get; set; } 

    [Display(Name = "Choose a Password")] 
    [StringLength(64)] 
    [Required] 
    public string password { get; set; } 

    [Display(Name = "Enter Password Again")] 
    [StringLength(64)] 
    [Required] 
    public string confirmPassword { get; set; } 

} 

注意有一個「密碼」一欄,但沒有「confirmPassword」然而,在的usermodel,有。

我的想法是UserAccount類,它使用UserModel類作爲元數據,現在應該包含'confirmPassword'的定義。

這是我遇到的問題。在註冊視圖,我用的usermodel作爲模型,因此在頁面的頂部,我有:

@model OurAgreements.Models.UserModel 

問題就來了控制器,當我嘗試保存。此代碼:

public ActionResult Register(UserModel model) 
    { 
     var repo = new Repository(); 

     if (ModelState.IsValid) 
     { 
      using (var db = new ouragreementEntities()) 
      { 
       db.useraccount.Add(model); 
       db.SaveChanges(); 
      } 

      return View(); 
     } 

給出錯誤,無法將UserModel轉換爲useraccount。我可以理解這一點,我試圖將數據放入與所有列不匹配的表中。

於是我想我會在視圖改變模型:

@model OurAgreements.Models.useraccount 

,因爲按我的思路,useraccount類應該使用的usermodel,但這樣做,給出了一個錯誤,「useraccount沒有'confirmPassword'的定義

所以我有點卡住了。我知道我可以切換回使用UserModel作爲模型,然後在控制器中,我可以構建一個新的useraccount實例,並使用模型中的數據填充它,然後將實例保存到數據庫。

所以我想我的問題是,爲什麼useraccount不包含confirmPassword的定義?

回答

0

通過創建包含您的DataAnnotations和其他屬性不在數據庫中的屬性的View Model,您之前走在了正確的道路上。此ViewModel及其相關DataAnnotations可幫助您執行業務驗證邏輯,並允許您將一個或多個有價值數據表映射到您的視圖的單個類。

因此,至於我認爲您的整體問題是什麼,爲什麼數據庫中沒有確認密碼?爲什麼會有?在數據庫中擁有兩份相同的數據在存儲數據領域沒有意義。

確認密碼是一個業務邏輯/用戶輸入檢查,以確保他們沒有「髮指」密碼並鎖定自己的帳戶。一旦你確認他們輸入的密碼是他們想要的密碼(密碼== confirmPassword),你將密碼散列並放入數據庫。

1

首先要做的事情。改變你的班級的名字。使用UserAccountMetadata/UserAccount。這使事情變得更容易閱讀和理解。

此外,使用比較屬性在確認密碼字段,這樣就可以確保它們相符。數據類型屬性應該出現在兩個密碼字段中。

[DataType(DataType.Password)] 
[Display(Name = "Confirm Password")] 
[Compare("Password", ErrorMessage = "Password and confirm password must be same!")] 
public string confirmPassword { get; set; } 

您的視圖使用的模型應該是UserAccount。

之前你通過視圖模型(UserAccount),到將其保存在數據庫中的方法,你需要把它映射到該方法將對象,它看起來就像是你的域模型對象。你可以手動做到這一點,但這很麻煩。使用一個映射工具,比如AutoMapper自動爲你做。您可以告訴AutoMapper UserAccount映射中的哪些字段是域模型中的哪些字段。