ModelState对于空的非必填字段标记为无效

时间:2013-03-26 17:10:10

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

有点神秘。我有一个带有Year属性的viewmodel:

public class TradeSpendingSalesViewModel
{       
    public string ProductCode { get; set; }
    public IEnumerable<SelectListItem> AllowTypeSelect { get; set; }
    public string AllowType { get; set; }
    public IEnumerable<SelectListItem> YearsSelect { get; set; }
    public int Year { get; set; }
}

如果我将一个空的viewmodel发布到我的控制器:

[HttpPost]
public ActionResult Index(TradeSpendingSalesViewModel vm)
{
    var allErrors = ModelState.Values.SelectMany(v => v.Errors);
    foreach (var e in allErrors)
    {
        Response.Write(e.ErrorMessage);
    }
}

然后我收到一条错误消息:“年份字段是必需的。”

由于我没有使用Required属性注释viewmodel Year字段,因此我不清楚为什么会生成此错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:16)

默认情况下,ValueTypes在mvc中隐式标记为Required。实际上,这是为了目的,因为根据定义它们是不可为空的。

我建议您将Year设为int?,否则,如果您的情况不正确,则可能会更改为

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

在Global.asax.cs。

答案 1 :(得分:15)

我的第一个猜测是它会抛出一个异常,你没有设置年份而且它是空的?如果你把年份变为Nullable&lt; int&gt;它不会抛出所需的消息吗?

我仍然不希望它被要求,它是在黑暗中拍摄的