【发布时间】:2015-07-27 09:31:30
【问题描述】:
我有以下模型类:
public abstract class CompanyFormViewModelBase
{
public CompanyFormViewModelBase()
{
Role = new CompanyRoleListViewModel();
ContactPerson = new PersonListViewModel();
Sector = new SectorListViewModel();
}
[Required]
[Display(Name = "Company Name")]
public string CompanyName { get; set; }
public CompanyRoleListViewModel Role { get; set; }
[Display(Name = "Contact Name")]
public PersonListViewModel ContactPerson { get; set; }
public SectorListViewModel Sector { get; set; }
}
public class AddCompanyViewModel : CompanyFormViewModelBase, IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
PlugandabandonEntities db = new PlugandabandonEntities();
CompanyName = CompanyName.Trim();
var results = new List<ValidationResult>();
if (db.Company.Where(p => p.CompanyName.ToLower() == CompanyName.ToLower()).Count() > 0)
results.Add(new ValidationResult("Company already exists.", new string[] { "CompanyName" }));
return results;
}
}
它适用于“经典”,使用如下:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Plugandabandon.ViewModels.AddCompanyViewModel model)
{
if (ModelState.IsValid)
{
CreateCompany(model);
return RedirectToAction("Index");
}
else
{
return View(model);
}
}
但我也想将此模型类用于另一种 ajax 形式。 我有以下方法:
public JsonResult ReturnJsonAddingCompany(string companyName, int roleID, int sectorID, int personID)
{
Plugandabandon.ViewModels.AddCompanyViewModel model = new ViewModels.AddCompanyViewModel()
{
CompanyName = companyName,
ContactPerson = new ViewModels.PersonListViewModel()
{
SelectedItem = personID
},
Role = new ViewModels.CompanyRoleListViewModel()
{
SelectedItem = roleID
},
Sector = new ViewModels.SectorListViewModel()
{
SelectedItem = sectorID
}
};
ValidateModel(model);
if (ModelState.IsValid)
{
CreateCompany(model);
}
else
{
throw new Exception("Company with such name already exists");
}
var list = Utils.CompanyList();
return Json(list, JsonRequestBehavior.AllowGet);
}
看看
ValidateModel(model);
线。如果模型是正确的 - 它工作正常。如果不正确 - 它抛出异常并中断方法的继续执行(并将异常返回到视图)。另外,如果我在
上设置断点public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
方法,它从未在无效的模型案例中调用! (使用有效模型 Validate 方法被调用)。我想要像“经典”方法这样的行为,只需验证模型,然后验证 ModelState.IsValid。 ValidateModel(model) 的行为对我来说很奇怪,它是一个“黑匣子”......
【问题讨论】:
-
您需要使用TryValidateModel。但是为什么你的
ReturnJsonAddingCompany()方法不只是有Plugandabandon.ViewModels.AddCompanyViewModel model作为参数呢? -
因为我通过 ajax 调用它
-
这与它有什么关系。如果您的控件与模型无关,您可以序列化您的表单,或者您可以将发布的值命名为与模型属性相同
-
也许你是对的。但在这种情况下,像参数一样传递而不是模型对我来说更舒服..
标签: validation asp.net-mvc-5 ivalidatableobject