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

Mis*_*pic 9 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

然后我收到一个错误消息:"年份字段是必需的."

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

有任何想法吗?

Dim*_*ima 16

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

我建议你设置Yearint?,否则,如果你的情况不正确,你可能会改为false

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

在Global.asax.cs中.

  • 始终需要不可为空的值.如果要获得非必需的Integer值,则必须将其设置为可为空. (2认同)

Ant*_*haw 15

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

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