【问题标题】:In asp.net-mvc, what is causing my model state errors?在 asp.net-mvc 中,是什么导致我的模型状态错误?
【发布时间】:2012-08-20 17:44:35
【问题描述】:

我在 asp.net-mvc 页面中发布了一个表单。这是我的控制器操作:

    public ActionResult UpdateData(MyFormObject entity)
    {
        bool isValid = IsValid(entity);

        if (!isValid)
        {
            var firstError = ModelState.Values.SelectMany(v => v.Errors).First();
            throw new HttpException(404, firstError.ErrorMessage);
        }
        return Json(BuildResult(entity));
    }

即使认为帖子通过了我所有的显式验证逻辑,当我检查 ModelState 时,我也会看到错误。当我的任何属性为空时,我在 ModelState 中看到错误。这是我的对象:

public class MyFormObject 
{
    public int Id{ get; set; }
    public int TestId{ get; set; }
    public int OtherId{ get; set; }
}

我正在查看 Model.State 并且我看到对象中未填充的任何元素的错误。

如果我将其更改为(注意:“?”)

public class MyFormObject 
{
    public int? Id{ get; set; }
    public int? TestId{ get; set; }
    public int? OtherId{ get; set; }
}

然后我不再收到任何错误。这里是否有一些我没有设置的默认验证。我试图弄清楚在上面的第一种情况下是什么设置了 ModelState 错误。

【问题讨论】:

  • IsValid 有什么作用?为什么不直接使用 ModelState.IsValid
  • 同时显示视图标记。

标签: c# asp.net-mvc validation post


【解决方案1】:

当您定位到将MyFormObject 类对象作为参数的控制器操作时,MVC 引擎将尝试通过自动模型绑定创建该类的实例。为了创建MyFormObject,需要提供所有这些:

public int Id{ get; set; }
public int TestId{ get; set; }
public int OtherId{ get; set; }

如果您至少不提供其中任何一个,它将尝试将 null 分配给相应的属性。 int(值类型)不支持空值,而int? 支持。

这在逻辑上是正确的,从长远来看实际上对您有帮助。

【讨论】:

    【解决方案2】:

    正如@Maxim V. Pavlov 所说,当您发布时,ASP.MVC 引擎将尝试验证模型,即它的类,并且基于您作为示例引用的类,属性不接受 null 或空值, 那么会抛出异常,ModelState 会失效。

    你可以在这里@Validating Model Data in an MVC ApplicationModelStateDictionary.IsValid Property看到更多

    【讨论】:

      【解决方案3】:

      您可能正在向 UpdateData 方法提交一个空的 MyFormObject。值类型不能为 null,并且必须 分配一个值。如果某个值类型缺少某个值,则会自动触发必填字段验证。

      ASP.NET MVC 甚至有一个属性可以让您调整这种行为,尽管我相信它只会影响客户端验证:

      DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

      【讨论】:

      • 我没有传入一个空对象,只是一些属性是空的。 .我的观点是,不应该由我来确定是否应该产生 ModelState 错误吗?我知道我可以在此基础上创建自己的模型验证逻辑,但试图理解这种默认行为
      • 默认行为是隐式要求值类型的字段具有值。如果这些属性为空,会发生什么?他们应该默认为零吗?它们应该是“空”吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2010-12-07
      • 2010-10-09
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多