【发布时间】:2014-03-11 12:07:37
【问题描述】:
我在 MVC4 中发现了一些让我感到困惑的功能。我有以下模型和控制器操作:
public class MyModel
{
public int Foo { get; set; }
}
public ActionResult MyAction(MyModel model)
{
// check ModelState.IsValid and do stuff
}
我遇到的问题是,如果我向 MyAction 发出 GET 请求并且不传递任何参数,则 ModelState.IsValid 为真。如果我将 Foo 作为参数传入,并以空字符串作为值,则 ModelState.IsValid 如预期的那样为 false(带有需要 Foo 的错误消息)。
所以我想我的问题是,当省略 Foo 时,为什么 ModelState.IsValid 为真?这是 MVC 中的错误还是我只是遗漏了什么?如果需要某个属性,则在省略该属性时似乎应该出现 ModelState 错误。
只是为了好玩,我尝试将 Foo 更改为字符串并向其添加 [Required] 属性。当我这样做时,上述两个测试都为 ModelState.IsValid 返回 false,这也是我期望它对不可为空的 int 属性所做的事情。在此测试之后,我将 Foo 改回 int 并留下 [Required] 属性以查看是否有任何效果。仍然得到与没有 [Required] 属性的 int 相同的结果。
【问题讨论】:
-
你确定
Foo在你省略时为空,还是默认为0?我猜Foo会是 0 并且没有[Required]属性它会通过验证。 -
@Brandon 我从未说过 Foo 在省略时为空。在这两种情况下它都是 0,但只有一种情况会引发 ModelState 错误。并且当被省略时,它会通过有或没有 [Required] 属性的验证(当 Foo 是一个 int 时)。
-
我猜不同之处在于,一个不可为空的
int在模型中通过时将有一个值,而标记中没有该字段。那是零。但是,如果string未在标记中通过,则null将是null。对我来说很有意义(不是错误)。 -
@SimonWhitehead 那么,您将如何使 int 成为必需的,以便在省略和作为空表单参数提交时给您一个 ModelState 错误?我已经看到它可以使用字符串属性来完成,但到目前为止还无法使用 int 属性来完成。
-
@SimonWhitehead 从概念的角度来看,如果您在模型中指定一个字段是必需的(在这种情况下,通过使其不可为空),则不为在您的 http 请求中应该意味着模型的状态无效......让一个不可为空的值允许空值似乎违反直觉,这就是这种行为所表明的。
标签: c# asp.net-mvc asp.net-mvc-4