2011-11-25 79 views
0

我已經選擇LINQ to SQL作爲ASP .NET MVC3項目的ORM框架。在我面臨需要在註冊表單中添加額外字段「確認密碼」之前,一切都很好。正如在一個關於SO的問題中提到的(不幸的是我現在找不到它),最好使用接口將生成的LINQ擴展爲帶有驗證屬性的SQL類,而不是讓另一個類來存儲驗證屬性。所以在這裏,我們去:將LINQ擴展到SQL生成的類

public interface IRegTry 
    { 
     [Required] 
     [Email] 
     string EMail { get; set; } 

     [Required] 
     [StringLength(100, ErrorMessage = "Should not exceed 100 symbols")] 
     string FirstName { get; set; } 

     [Required]   
     string Password { get; set; }   

    } 

    [MetadataType(typeof(IRegTry))] 
    public partial class RegTry : IRegTry { } 

RegTry類由LINQ生成的類基於數據庫實體SQL。

在視圖上我們確認了密碼字段,它應該確保兩個輸入的密碼相互等同。

所以在這裏我們將其添加:

public class RegTryViewModel : RegTry 
{ 
    [Required] 
    [EqualTo("Password", ErrorMessage = "You should type two identical passwords to continue")] 
    public string ConfirmPassword { get; set; } 
} 

的看法是強類型的視圖,RegTryViewModel模型。

我只是問在這裏,以確保我做的一切正確。讓我感到不舒服的是我在IRegTry接口和RegTryViewModel類之間傳播了驗證邏輯。但是我不能將ConfirmPassword屬性添加到IRegTry接口,因爲基於SQL的LINQ類根本沒有它。 在此先感謝你們!

回答

1

我知道你已經接受了這個答案,但我認爲使用partial類來設置它可能會更好。只要您在相同名稱的namespace中設置partial課程,所有內容都將自動設置。下面是我如何我的一個項目設置這一個例子:

namespace OperationsMetrics 
{ 
[MetadataType(typeof(ClientStatMD))] 
public partial class client_wkly_stat : IValidatableObject 
{ 
    public class ClientStatMD 
    { 
     [Required(ErrorMessage = "Client selection is required")] 
     public virtual int client_id { get; set; } 
     [Required(ErrorMessage = "SLAs met is required")] 
     public virtual int wkly_sla_met { get; set; } 
     [Required(ErrorMessage = "Total SLAs possible is required")] 
     public virtual int wkly_sla_req { get; set; } 
     [Required(ErrorMessage = "Number of input files is received")] 
     public virtual int num_inp_files_rec { get; set; } 
     [Required] 
     public string client_name { get; set; } 

    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (wkly_sla_met > wkly_sla_req) 
     { 
      yield return new ValidationResult("SLAs met cannot be greater that SLAs possible"); 
     } 


    } 
    public string client_name { get; set; } //this isn't a part of the actual db object but can still be accessed in the Validate method 
} 

}

您可以設置部分類爲IValidatableObject它實現了自己的Validate方法。您可以在Validate方法中檢查Confirm==Password

你可以在這個Pluralsight Video

+0

PluralSight鏈接已損壞,如果有效的鏈接可用,請更新 –

1

如果您使用View Model類,則不需要連接到DAL Model類的驗證邏輯,因此您不需要鏈接到DAL Model類的驗證接口。

+0

一些詳細信息,但如果我仍然需要對接口,可以說,單元測試的目的,我應該怎麼辦呢? – kseen

+0

我仍然保持驗證邏輯僅與驗證類連接;如果您沒有將它們傳遞給模型綁定器,則不需要DAL類具有任何驗證邏輯。 –

+0

好的,我明白了。您能否爲我提供代碼示例?我有點沮喪。 – kseen