哪个数据注释属性创建了这个验证属性?
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.asax
的Application_Start()
中添加以下内容
ClientDataTypeModelValidatorProvider.ResourceClassKey = "MyResources";
DefaultModelBinder.ResourceClassKey = "MyResources";
请注意,您还可以使用 PropertyValueRequired
键覆盖 [Required]
属性的默认错误消息
【讨论】:
我将继续并将其标记为已回答,因为这似乎是正确的,但您能否说明您是如何找到FieldMustBeDate
的?
它在MvcResources.resx(第445行)中定义并通过ClientDataTypeModelValidatorProvider.cs访问。 (第 97 行)ASAIK,它们是您可以覆盖的 4 个默认值 - FieldMustBeDate
、FieldMustBeNumeric
、PropertyValueInvalid
和 PropertyValueRequired
我很高兴覆盖默认的必需消息。你确定PropertyValueRequired
?
@Kivin,几乎可以肯定,但我认为您需要在 Global.asax
- DefaultModelBinder.ResourceClassKey = "MyResources";
中进行额外设置,因为 PropertyValueInvalid
和 PropertyValueRequired
是在不同的命名空间中定义的 (System.ComponentModel.DataAnnotations
) .我现在正在休假,所以目前无法确认,但发现 this answer 有更多信息以上是关于哪个数据注释属性创建了这个验证属性?的主要内容,如果未能解决你的问题,请参考以下文章