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

我为 RequiredDataType 标签添加了不同的 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 想要它完美和干净,不能使用使用“默认值”的“旧方法”。