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

4 回答 4

4

因为您将文本框设置为禁用,所以没有发布数据。

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

ModelState.Remove("User.RegistrationNumber");

打电话之前ModelState.IsValid

于 2013-04-17T21:17:01.327 回答
1

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

于 2013-04-17T21:06:48.903 回答
1

验证发生在您调用之前IsValid,错误将出现在字典中。

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

[HttpPost]
public ActionResult Create(ExampleViewModel model)
{
    if (ModelState["User.RegistrationNumber"].Errors.Count == 1) {
        model.User.RegistrationNumber = this.RegistrationNumber;
        ModelState["User.RegistrationNumber"].Errors.Clear();
    }
}
于 2013-04-17T21:07:44.060 回答
0

此处的其他解决方案在 .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)
{
    // ...
}
于 2020-09-17T23:38:00.343 回答