有点神秘。我有一个带有 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 字段,所以我不清楚为什么会生成此错误。
有什么想法吗?
ValueTypes 默认情况下在 mvc 中隐式标记为
Required
。实际上,这样做是有目的的,因为根据定义它们是不可为空的。
我建议你将
Year
设置为 int?
,否则,如果你的情况不正确,你可以改为 false
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes
在 Global.asax.cs 中。
我的第一个猜测是它抛出了一个异常,您没有设置年份并且它为空?如果您将年份设置为 Nullable
我仍然没想到会需要它,这是在黑暗中拍摄
这仍然可能是 .NET Core 项目中的一个问题。我在这里找到了解决方案:
.NET 会将您的参数标记为无效,如果它不是所需的可空类型。您可以在 MvcOptions 中将 SuppressImplicitRequiredAttributeForNonNullableReferenceTypes 属性设置为 true。 Program.cs 中的示例:
services.AddControllers(option =>
{
option.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true;
});
当您设置此选项时。它只会检查所需的属性。或者你可以使用“?”标记以使您的属性可为空,这也可以。