MVC .Net Core 模型验证 - 值“”无效。错误
MVC .Net Core Model Validation - The value '' is invalid. Error
我正在尝试在 MVC .Net Core 中使用模型验证,但无法设法替换此默认错误消息 'The value ''无效'。
理论上,我们可以通过在模型中使用ErrorMessage
注解来替换我们自己自定义的错误信息。但是我找不到一种方法来实现它。
我的模型
[Required(ErrorMessage = "Date Required")]
[DataType(DataType.Date, ErrorMessage = "Invalid Date Format")]
[Display(Name = "Appointment Date")]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime AppointmentDate { get; set; }
我为 Required
和 DataType
标签添加了不同的 ErrorMessage
,如上所示。
我的html视图
<div class="col-md-2">
<input class="form-control" asp-for="AppointmentDate">
<span asp-validation-for="AppointmentDate" class="text-danger"></span>
</div>
能否请您帮助我如何替换该错误消息?谢谢。
为了使您的 Required
属性有效,您需要使字段可为空:
public DateTime? AppointmentDate { get; set; }
Edit:另请注意,DataType
属性实际上不对字段执行验证。将 post
数据绑定到 model
时 MVC 验证日期
我的问题是,在创建操作中,我 return 视图没有更新实体,当我更改它时,即 Return View(new MyEntity());
它解决了问题
遇到同样的问题但无法检测到问题。我在调试模式下检查了对象,看看是否有任何方法可以查看哪个 属性 使模型状态失败。
然后我看看哪个模型失败了。
这是一个映射到复选框的布尔值
奇怪的部分是 "this is not a Required field"!
我加了个问号,用的时候用了getvalueordefault方法
public bool? IsCorporateAccount { get; set; }
我的具体问题与 select 选项验证有关,显示了类似的消息,而不是来自模型的自定义消息。除了关于使经过验证的 属性 可为空的答案之外,请仔细检查 DOM 元素中的实际值。我的问题是通过添加可空性和空字符串作为默认选项中的值解决的,默认选项应该是一个整数。
<select asp-for="@Model.Thing" asp-items="Model.Things"
<option value="" selected>Please select a Thing</option>
</select>
<span asp-validation-for="@Model.Thing" class="text-danger"></span>
.NET Core 3 验证系统更改后。不可为 null 的参数被视为具有 [Required] 属性。即使您不应用 [Required] 属性,您也会获得客户端验证。
客户端 JQuery 验证接受空字符串字段,但一旦发送到服务器,相同的字段将得到无效结果。 The value '' is invalid
是服务器端验证的默认错误消息。
根据 asp.net 文档,通过使用 [Required] 属性,您可以覆盖此消息,但它不适用于空字段。
不幸的是,此功能为引用不可为 null 的 int 属性的隐藏输入字段生成空字符串值 ("")(即 @Html.Hiddenfor(m=>m.id)
将为 html 元素生成 ""。)
因此,在 asp.net 文档中提供的所有选项中,最安全的选项是使 属性 可为空。另一个不错的选择是将 .NET 默认消息更改为其他内容
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
_ => "The field is required.");
});
您可以阅读更多相关内容 here。
在某些情况下,验证摘要可能是原因:
将 "All" 更改为 "ModelOnly":
<div asp-validation-summary="All" class="text-danger"></div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
在我的场景中,我的模型 'NeedToPrint' 属性 出现验证错误。我必须确保在我的 cshtml 文件中指定了一个值,如下所示:
<button type="submit" name="NeedToPrint" value="false" class="btn btn-default" >Submit</button>
在“获取”动作中,我实例化了对象并将其作为模型传递给视图,即使我没有对它做任何事情,但现在看来.Net Core 想要它完美和干净,不能使用使用“默认值”的“旧方法”。
我正在尝试在 MVC .Net Core 中使用模型验证,但无法设法替换此默认错误消息 'The value ''无效'。
理论上,我们可以通过在模型中使用ErrorMessage
注解来替换我们自己自定义的错误信息。但是我找不到一种方法来实现它。
我的模型
[Required(ErrorMessage = "Date Required")]
[DataType(DataType.Date, ErrorMessage = "Invalid Date Format")]
[Display(Name = "Appointment Date")]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime AppointmentDate { get; set; }
我为 Required
和 DataType
标签添加了不同的 ErrorMessage
,如上所示。
我的html视图
<div class="col-md-2">
<input class="form-control" asp-for="AppointmentDate">
<span asp-validation-for="AppointmentDate" class="text-danger"></span>
</div>
能否请您帮助我如何替换该错误消息?谢谢。
为了使您的 Required
属性有效,您需要使字段可为空:
public DateTime? AppointmentDate { get; set; }
Edit:另请注意,DataType
属性实际上不对字段执行验证。将 post
数据绑定到 model
我的问题是,在创建操作中,我 return 视图没有更新实体,当我更改它时,即 Return View(new MyEntity());
它解决了问题
遇到同样的问题但无法检测到问题。我在调试模式下检查了对象,看看是否有任何方法可以查看哪个 属性 使模型状态失败。
然后我看看哪个模型失败了。 这是一个映射到复选框的布尔值
奇怪的部分是 "this is not a Required field"!
我加了个问号,用的时候用了getvalueordefault方法
public bool? IsCorporateAccount { get; set; }
我的具体问题与 select 选项验证有关,显示了类似的消息,而不是来自模型的自定义消息。除了关于使经过验证的 属性 可为空的答案之外,请仔细检查 DOM 元素中的实际值。我的问题是通过添加可空性和空字符串作为默认选项中的值解决的,默认选项应该是一个整数。
<select asp-for="@Model.Thing" asp-items="Model.Things"
<option value="" selected>Please select a Thing</option>
</select>
<span asp-validation-for="@Model.Thing" class="text-danger"></span>
.NET Core 3 验证系统更改后。不可为 null 的参数被视为具有 [Required] 属性。即使您不应用 [Required] 属性,您也会获得客户端验证。
客户端 JQuery 验证接受空字符串字段,但一旦发送到服务器,相同的字段将得到无效结果。 The value '' is invalid
是服务器端验证的默认错误消息。
根据 asp.net 文档,通过使用 [Required] 属性,您可以覆盖此消息,但它不适用于空字段。
不幸的是,此功能为引用不可为 null 的 int 属性的隐藏输入字段生成空字符串值 ("")(即 @Html.Hiddenfor(m=>m.id)
将为 html 元素生成 ""。)
因此,在 asp.net 文档中提供的所有选项中,最安全的选项是使 属性 可为空。另一个不错的选择是将 .NET 默认消息更改为其他内容
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
_ => "The field is required.");
});
您可以阅读更多相关内容 here。
在某些情况下,验证摘要可能是原因: 将 "All" 更改为 "ModelOnly":
<div asp-validation-summary="All" class="text-danger"></div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
在我的场景中,我的模型 'NeedToPrint' 属性 出现验证错误。我必须确保在我的 cshtml 文件中指定了一个值,如下所示:
<button type="submit" name="NeedToPrint" value="false" class="btn btn-default" >Submit</button>
在“获取”动作中,我实例化了对象并将其作为模型传递给视图,即使我没有对它做任何事情,但现在看来.Net Core 想要它完美和干净,不能使用使用“默认值”的“旧方法”。