0

我在 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 错误。

4

3 回答 3

3

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

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

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

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

于 2012-08-20T18:07:05.490 回答
2

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

您可以在此处查看更多信息@Validating Model Data in an MVC Application和此处ModelStateDictionary.IsValid 属性

于 2012-08-20T18:32:35.847 回答
0

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

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

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

于 2012-08-20T17:50:54.027 回答