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

问题描述 投票:0回答:3

有点神秘。我有一个带有 Year 属性的视图模型:

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; }
}

如果我将空视图模型发布到我的控制器:

[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 字段,所以我不清楚为什么会生成此错误。

有什么想法吗?

asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
3个回答
18
投票

ValueTypes 默认情况下在 mvc 中隐式标记为

Required
。实际上,这样做是有目的的,因为根据定义它们是不可为空的。

我建议你将

Year
设置为
int?
,否则,如果你的情况不正确,你可以改为 false

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

在 Global.asax.cs 中。


15
投票

我的第一个猜测是它抛出了一个异常,您没有设置年份并且它为空?如果您将年份设置为 Nullable 它不会抛出所需的消息吗?

我仍然没想到会需要它,这是在黑暗中拍摄


0
投票

这仍然可能是 .NET Core 项目中的一个问题。我在这里找到了解决方案:

https://learn.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-8.0#non-nullable-reference-types-and-required-attribute

.NET 会将您的参数标记为无效,如果它不是所需的可空类型。您可以在 MvcOptions 中将 SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 属性设置为 true。 Program.cs 中的示例:

services.AddControllers(option =>
{
    option.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true;
});

当您设置此选项时。它只会检查所需的属性。或者你可以使用“?”标记以使您的属性可为空,这也可以。

© www.soinside.com 2019 - 2024. All rights reserved.