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

C# 在asp.net-mvc中,是什么导致我的模型状态错误?,c#,asp.net-mvc,validation,post,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

我正在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));
    }
即使post通过了我所有的显式验证逻辑,当我检查ModelState时,我也会看到错误。当我的任何属性为空时,我在ModelState中看到错误。这是我的目标:

public class MyFormObject 
{
    public int Id{ get; set; }
    public int TestId{ get; set; }
    public int OtherId{ get; set; }
}
我正在查看Model.State,我看到了对象中任何未填充元素的错误

如果我将此项更改为(注:“?”)


这样我就不会再有任何错误了。这里是否有一些我没有设置的默认验证。我试图找出在上述第一种情况下设置ModelState错误的原因。

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

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


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

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


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

public int Id{ get; set; }
public int TestId{ get; set; }
public int OtherId{ get; set; }
如果您至少没有提供其中任何一个,它将尝试为相应的属性分配null。
int
(值类型)不支持空值,而
int?
支持空值


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

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

public int Id{ get; set; }
public int TestId{ get; set; }
public int OtherId{ get; set; }
如果您至少没有提供其中任何一个,它将尝试为相应的属性分配null。
int
(值类型)不支持空值,而
int?
支持空值


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

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


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


你可以在这里看到更多@和这里

我没有传递一个空对象,只是一些属性是空的。我的观点是,不应该由我来决定是否应该创建一个ModelState错误吗?我知道我可以在此基础上创建自己的模型验证逻辑,但要理解此默认行为默认行为是隐式要求值类型的字段具有值。如果这些属性为空,会发生什么情况?它们应该默认为零吗?它们是否应该为“null”?我没有传入空对象,只是一些属性为空。我的观点是,不应该由我来决定是否应该创建一个ModelState错误吗?我知道我可以在此基础上创建自己的模型验证逻辑,但要理解此默认行为默认行为是隐式要求值类型的字段具有值。如果这些属性为空,会发生什么情况?它们应该默认为零吗?它们应该是“null”吗?IsValid做什么?为什么不直接使用ModelState.IsValidShow来显示视图标记呢?为什么不使用ModelState.IsValidShow显式显示视图标记呢。