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

Posted

技术标签:

【中文标题】MVC .Net Core 模型验证 - 值“”无效。错误【英文标题】:MVC .Net Core Model Validation - The value '' is invalid. Error 【发布时间】:2017-04-07 15:01:34 【问题描述】:

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

理论上,我们可以通过在模型中使用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>

您能帮我如何替换该错误消息吗?谢谢。

【问题讨论】:

你check this了吗?这可能就是你要找的东西 谢谢,但不是那个。它是用另一种语言(如西班牙语或意大利语等)替换错误消息。 【参考方案1】:

为了使您的Required 属性有效,您需要使字段可为空:

public DateTime? AppointmentDate  get; set; 

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

【讨论】:

我遇到了同样的问题,但是,我拥有[Required] 的唯一字段是字符串。而且,对于添加和编辑实体,我有相同的控制器操作。编辑时,它工作正常(在我在控制器中做任何事情之前,我检查了ModelState),但是在添加新实体时会跳闸。实体上的一切都完全相同 我也遇到了同样的问题,不同的是我的属性是 Guid 类型。让它可以为空解决了这个问题。【参考方案2】:

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

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

您可以阅读有关此here 的更多信息。

【讨论】:

【参考方案3】:

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

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

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

我加了一个问号,使用的时候用了getvalueordefault方法

public bool? IsCorporateAccount  get; set; 

【讨论】:

完美!谢谢。 :)【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我的具体问题与显示类似消息的选择选项验证有关,而不是来自模型的自定义消息。除了关于使验证的属性可以为空的答案之外,请仔细检查 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>

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

在“获取”操作中,我实例化了对象并将其作为模型传递给视图,即使我不对其进行任何操作,但现在看来 .Net Core 想要它完美和干净,可以' t 使用“默认方式”使用“旧方式”。

【讨论】:

以上是关于MVC .Net Core 模型验证 - 值“”无效。错误的主要内容,如果未能解决你的问题,请参考以下文章

[ASP.NET Core 3.1 MVC Razor页面仅在模型成员有效时显示图标

asp.net mvc 中模型验证如何处理数组呢?

ASP.NET Core MVC POST 方法一个具有外键 ID 的模型

ASP.Net Core MVC 如何针对强类型模型发布未知数量的字段

基于模型 ASP.NET Core MVC 5 中的另一个属性分配属性的值

ASP.Net Core MVC - 自定义验证