为什么当我在ModelState之前更新模型时,ModelState报告错误?IsValid检查

本文关键字:ModelState 错误 报告 检查 IsValid 更新 为什么 模型 | 更新日期: 2023-09-27 18:09:37

我的控制器代码如下:

[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
    model.User.RegistrationNumber = this.RegistrationNumber;
    if (ModelState.IsValid)
    {
    }
    return View("Create", model);
}

我一直得到一个验证错误消息,说"Registration Number cannot be blank",但我正在显式地设置它。

我是否必须重置ModelState,因为我以某种方式修改了模型?

发生了什么基本上我把文本框设置为禁用,然后在表单发布期间数据丢失,所以我必须再次显式设置它

为什么当我在ModelState之前更新模型时,ModelState报告错误?IsValid检查

由于您将文本框设置为禁用,因此没有发布数据。

当您自己设置值时,您可以通过以下操作删除该字段上的错误:

ModelState.Remove("User.RegistrationNumber");
呼叫ModelState.IsValid

到控制器中设置注册号的代码行时,ModelState验证已经发生。它发生在调用控制器上的Create()方法之前。从您的描述中很难知道您究竟想要实现什么,但是如果您不想要验证该字段,您可以通过注释[required]属性来关闭该字段的验证。

在调用IsValid之前进行验证,并且错误键将出现在字典中。

我不确定这是否是最好的处理方式,但我一直在做这样的事情:

[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
    if (ModelState["User.RegistrationNumber"].Errors.Count == 1) {
        model.User.RegistrationNumber = this.RegistrationNumber;
        ModelState["User.RegistrationNumber"].Errors.Clear();
    }
}

这里的其他解决方案并没有像预期的那样在。net Core 3.1中工作,所以我使用了以下替代方案,它显式地只设置所需模型属性的验证状态。

if (ModelState["Property"].Errors.Count > 0)
{
    model.Property = someRequiredProperty; // db query using FirstOrDefault()
    if (model.Property != null)
    {
        ModelState["Property"].ValidationState = ModelValidationState.Valid;
    }
}
if (ModelState.IsValid)
{
    // ...
}