Controller.ValidateModel 方法。它是如何工作的?

Controller.ValidateModel method. How it work?

我有以下型号class:

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;
    }
}

它可以很好地与 "classic" 一起使用,例如:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Plugandabandon.ViewModels.AddCompanyViewModel model)
    {
        if (ModelState.IsValid)
        {
            CreateCompany(model);
            return RedirectToAction("Index");
        }
        else
        {
            return View(model);
        }
    }

但我想将此模型 class 用于另一个 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);

行。如果模型正确 - 它工作正常。如果不正确 - 它抛出异常并中断方法的继续执行(和 return 异常以查看)。另外,如果我在

上设置断点
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

方法,它从未在无效模型的情况下调用! (调用有效模型的 Validate 方法)。我想要像 "classic" 方法那样的行为,只需验证模型然后验证 ModelState.IsValid。 ValidateModel(model) 的行为对我来说很奇怪,它是 "black box"...

如果模型无效,

ValidateModel() 会抛出异常。相反,使用 TryValidateModel()

来自documentation

The TryValidateModel() is like the ValidateModel() method except that the TryValidateModel() method does not throw an InvalidOperationExceptionexception if the model validation fails.