2011-05-11 69 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了解更多详情。