我在申请时遇到了一些问题。 假设我有以下模型:
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按钮时验证公司属性。
现在我只需要做这个服务方,但如果有人有解决方案来做这个客户端,我会很感激帮助。
答案 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。