2011-05-11 68 views
0

我在驗證我的應用程序時遇到了一些麻煩。 比方說,我有以下型號:ASP.Net MVC3條件驗證

public class Company 
    { 
     public int id { get; set; } 
     [Required] 
     public String Name { get; set; } 
     public String Location { get; set; } 
     public List<Contacts> Contacts { get; set; } 
    } 

    public class Contact 
    { 
     public int id { get; set; } 
     [Required] 
     public String Name { get; set; } 
     [DataType(DataType.EmailAddress)] 
     public String Email { get; set; } 
     public String Telephone { get; set; } 
     public String Mobile { get; set; } 
    } 

現在在我的公司創建視圖我有兩個按鈕,一個將聯繫人添加到該公司,而另一個以創建新公司。 我發現在我的控制器這樣使用了哪個按鈕(兩個按鈕被命名爲「按鈕」):

[HttpPost] 
    public ActionResult Create(String button, FormCollection collection) 
    { 
     if(button == "AddContact") 
     { 
      AddContact(collection); 
     } 
     else 
     { 
      CreateCompany(collection); 
     } 
    } 

雖然它正在創建一個代表公司,它正在創建存儲在會話(對象示例HttpContext.Session [「公司」] =公司;)

現在的問題是,如果,例如,我嘗試添加一個聯繫人沒有先指定公司名稱,我得到驗證錯誤,因爲公司名稱是這是不應該發生的,因爲用戶可能希望在添加公司信息之前添加聯繫人。或者如果我嘗試保存公司,我也會得到驗證錯誤,因爲通常在保存「添加聯繫人」表單時爲空,這意味着聯繫人姓名(也是必需的)未指定。

我想知道的是,如果僅在使用addContact按鈕時驗證聯繫人屬性,並且僅在按下createCompany按鈕時驗證公司屬性。

現在我只需要做這個服務端,但如果任何人有解決方案來做這個客戶端,以及我將不勝感激的幫助。

回答

0

您可以通過在覆蓋的DbContext使用DbEntityValidationResult實體框架提供條件驗證觸發各個對象自己的驗證。當在DbContext中進行此驗證時,您可以訪問其他實體。驗證聯繫人時,您也可以查看該公司。例如:

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items) 
    { 
     var result = base.ValidateEntity(entityEntry, items); 
     ValidateContact(result); 
     return result; 
    } 

    private void ValidateContact(DbEntityValidationResult result) 
    { 
     var contact= result.Entry.Entity as Contact; 
     if (contact!= null && contact.ContactId != 0) 
     { 
      // Add validation code here, such as: 
      if(!string.IsNullOrEmpty(contact.Company.Name){ 
        result.ValidationErrors.Add(
        new DbValidationError(
         "Contact", 
         "Company name cannot be null or empty when validating contacts.") 
        ); 
      } 
     } 
    } 

見朱莉婭·勒曼的編程實體框架:的DbContext http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969瞭解更多詳情。