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

时间:2013-04-17 21:02:51

标签: c# asp.net-mvc asp.net-mvc-4

我的控制器代码如下:

[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
    model.User.RegistrationNumber = this.RegistrationNumber;

    if (ModelState.IsValid)
    {

    }

    return View("Create", model);
}

我一直收到验证错误消息,说"Registration Number cannot be blank"但我明确地设置了它。

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

基本上我发生了什么事情我将文本框设置为禁用,然后在表单发布期间数据丢失,所以我必须再次明确地设置它。

4 个答案:

答案 0 :(得分:3)

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

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

ModelState.Remove("User.RegistrationNumber");
在调用ModelState.IsValid之前

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在您致电IsValid之前进行验证,错误将出现在字典中。

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

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

答案 3 :(得分:0)

此处的其他解决方案无法在.NET Core 3.1中按预期方式工作,因此我使用了以下替代方法,该替代方法显式地仅设置所需模型属性的Validation状态。

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)
{
    // ...
}