繁体   English   中英

MVC .Net Core 模型验证 - 值 '' 无效。 错误

[英]MVC .Net Core Model Validation - The value '' is invalid. Error

我正在尝试在 MVC .Net Core 中使用模型验证,但无法替换此默认错误消息“值”无效”。

理论上,我们可以通过在Model中使用ErrorMessage Annotation来替换我们自己自定义的错误信息。 但我找不到一种方法来使这个工作。

我的模特

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

编辑:还要注意DataType属性实际上并不对字段执行验证。 post数据绑定到model时,MVC 验证日期

.NET Core 3 验证系统更改后。 不可为空的参数被视为具有 [Required] 属性。 即使您不应用 [Required] 属性,您也会获得客户端验证。 客户端 JQuery 验证接受空字符串字段,但一旦发送到服务器,相同的字段将获得无效结果。 The value '' is invalid是服务器端验证的默认错误消息。 根据 asp.net 文档,通过使用 [Required] 属性,您可以覆盖此消息,但它不适用于空字段。 不幸的是,此功能为引用不可为空的 int 属性的隐藏输入字段生成空字符串值 ("")(即@Html.Hiddenfor(m=>m.id)将为 html 元素生成 ""。) asp.net 文档中提供的选项最安全的是使属性可以为空。 另一个不错的选择是将 .NET 默认消息更改为其他内容

services.AddRazorPages()
    .AddMvcOptions(options =>
    {
        options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
            _ => "The field is required.");
    });

您可以在此处阅读更多相关信息。

有同样的问题,但无法检测到问题。 我在调试模式下检查了对象,看看是否有任何方法可以查看哪个属性不符合模型状态。

模型状态对象的调试模式视图

然后我看到哪个失败的模型。 这是一个映射到复选框的布尔值

奇怪的部分是“这不是必填字段”!

我在使用它时添加了一个问号并使用了 getvalueordefault 方法

public bool? IsCorporateAccount { get; set; }

在某些情况下,验证摘要可能是原因:将“全部”更改为“ModelOnly”:

<div asp-validation-summary="All" class="text-danger"></div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>

我的问题是在创建操作中,我会返回视图而不更新实体,当我更改实体时,即Return View(new MyEntity()); 它解决了这个问题

我的具体问题与显示类似消息的选择选项验证有关,而不是来自模型的自定义消息。 除了关于使验证的属性可以为空的答案之外,还要仔细检查 DOM 元素中的实际值。 我的问题是通过添加可空性和一个空字符串作为默认选项中的值来解决的,默认选项应该是一个 int。

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

在我的场景中,我的模型的“NeedToPrint”属性出现验证错误。 我必须确保在我的 cshtml 文件中指定了一个 VALUE,如下所示:

 <button type="submit" name="NeedToPrint" value="false" class="btn btn-default" >Submit</button>

在“获取”操作中,我实例化了对象并将其作为模型传递给视图,即使我没有对它做任何事情,但现在看来 .Net Core 想要一切完美和干净,不能使用“旧方法”使用“默认值”。 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM