哪个数据注释属性创建了这个验证属性?

Posted

技术标签:

【中文标题】哪个数据注释属性创建了这个验证属性?【英文标题】:Which Data Annotation attribute creates this validation attribute? 【发布时间】:2018-06-29 04:16:27 【问题描述】:

假设我们有这样的模型:

public class TheViewModel

    public string DateTime? Image_Date  get; set; 

它被添加到 Razor 视图中,如下所示:

html.TextBoxFor(model => model.Image_Date)

然后在浏览器中渲染如下:

<input data-val="true" data-val-date="The field Image_Date must be a date." id="Image_Date" name="Image_Date" type="text" value="" />

data-val-date 属性是我感兴趣的。它显然是由 MVC 的“不显眼的”jQuery 验证集成注入的。

那么,什么数据注解会覆盖 HTML 属性中的措辞?

例如,[Required(ErrorMessage="This field is required!")] 将覆盖标准“需要字段 0”。消息。


尝试失败:

    [DataType(DataType.Date, ErrorMessage = "Must be a valid date.")] 似乎对客户端验证没有任何作用。

    [DisplayName("...")] 更改了模式的通配符部分,但显然不会影响模式本身。

【问题讨论】:

听起来你可能需要手动修复它***.com/questions/30510221/… 【参考方案1】:

data-val-date 属性由框架添加,因为该属性的类型为 DateTime?。它是HtmlHelper 类的GetUnobtrusiveValidationAttributes() 方法,它实际上生成了所有data-val-* 属性。

注意[DataType(DataType.Date, "...")]EditorFor() 方法用来添加type="date" 属性的属性,该属性反过来生成浏览器HTML-5 日期选择器(如果浏览器支持),并且与客户端无关验证。

默认错误消息在资源文件中定义,您可以创建自己的以覆盖默认值。

App_GlobalResources 文件夹中创建(比如)MyResources.resx(您可能需要创建此文件夹)并添加以下FieldMustBeDate 密钥和您的消息(默认消息如下所示)

FieldMustBeDate : The field 0 must be a date

并在Global.asaxApplication_Start()中添加以下内容

ClientDataTypeModelValidatorProvider.ResourceClassKey = "MyResources";
DefaultModelBinder.ResourceClassKey = "MyResources";

请注意,您还可以使用 PropertyValueRequired 键覆盖 [Required] 属性的默认错误消息

【讨论】:

我将继续并将其标记为已回答,因为这似乎是正确的,但您能否说明您是如何找到 FieldMustBeDate 的? 它在MvcResources.resx(第445行)中定义并通过ClientDataTypeModelValidatorProvider.cs访问。 (第 97 行)ASAIK,它们是您可以覆盖的 4 个默认值 - FieldMustBeDateFieldMustBeNumericPropertyValueInvalidPropertyValueRequired 我很高兴覆盖默认的必需消息。你确定PropertyValueRequired @Kivin,几乎可以肯定,但我认为您需要在 Global.asax - DefaultModelBinder.ResourceClassKey = "MyResources"; 中进行额外设置,因为 PropertyValueInvalidPropertyValueRequired 是在不同的命名空间中定义的 (System.ComponentModel.DataAnnotations) .我现在正在休假,所以目前无法确认,但发现 this answer 有更多信息

以上是关于哪个数据注释属性创建了这个验证属性?的主要内容,如果未能解决你的问题,请参考以下文章

验证 IList 属性数据注释

具有客户端验证的自定义数据注释验证属性

使用数据注释部分验证模型属性

使用数据注释和代码的自定义验证属性

如何使用数据注释为模型属性 WebApi .NET Core 添加布尔验证

csharp 自定义数据注释验证属性,用于验证数据是两个字符的美国州名缩写。