加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:55:07 所属栏目:asp.Net 来源:网络整理
导读:我有以下模型类: public abstract class CompanyFormViewModelBase{ public CompanyFormViewModelBase() { Role = new CompanyRoleListViewModel(); ContactPerson = new PersonListViewModel(); Sector = new SectorListViewModel(); } [Required] [Displa
我有以下模型类:

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(模型)的行为对我来说很奇怪,它是一个“黑盒子”……

解决方法

如果模型无效,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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读