ASP.Net MVC3条件验证

时间:2011-05-11 11:53:11

标签: asp.net validation asp.net-mvc-3

我在申请时遇到了一些问题。 假设我有以下模型:

    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 [“company”] = company;)

现在问题是,例如,如果我尝试在没有先指定公司名称的情况下添加联系人,则会收到验证错误,因为公司名称是必需的,这不应该发生,因为用户可能想要添加添加公司信息之前的联系人。或者,如果我尝试保存公司,我也会收到验证错误,因为通常在保存“添加联系人”表单时为空,这意味着未指定联系人姓名(也是必需的)。

我想知道的是,如果仅在使用addContact按钮时才能验证联系人属性,并且仅在按下createCompany按钮时验证公司属性。

现在我只需要做这个服务方,但如果有人有解决方案来做这个客户端,我会很感激帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用相应的对象触发自己的验证 Validator.TryValidateObject(Object, ValidationContext, ICollection)

答案 1 :(得分:0)

您可以通过覆盖DbContext中的DbEntityValidationResult,使用Entity Framework提供条件验证。在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.")
                     );
            }
        }
    }

有关详细信息,请参阅Julia Lerman的编程实体框架:DbContext http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969

相关问题