在asp.net-mvc中,是什么导致我的模型状态错误?

时间:2012-08-20 17:44:36

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

这在逻辑上是正确的,实际上可以长期帮助你。

答案 1 :(得分:2)

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

您可以在此处查看更多内容@ Validating Model Data in an MVC ApplicationModelStateDictionary.IsValid Property

答案 2 :(得分:0)

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

ASP.NET MVC甚至有一个允许你调整这种行为的属性,虽然我相信它只会影响客户端验证:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes