【问题标题】:Controller.ValidateModel method. How it work?Controller.ValidateModel 方法。它是如何工作的?
【发布时间】: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


【解决方案1】:

ValidateModel() 如果模型无效则抛出异常。相反,请使用TryValidateModel()

来自documentation

TryValidateModel() 与 ValidateModel() 方法类似,只是 TryValidateModel() 方法在模型验证失败时不会抛出 InvalidOperationException 异常。

【讨论】:

猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
相关资源
最近更新 更多