【问题标题】:MVC DataAnnotation Rendering Wrong HTMLin MVC3MVC 数据注释在 MVC3 中呈现错误的 HTML
【发布时间】:2011-04-14 13:54:22
【问题描述】:

我有一个简单的模型对象,如下所示:

[DataMember]
[DataType(DataType.Date)]
public DateTime WeekEndingDate { get; set; }

以及执行此操作的查看页面

 @Html.TextBoxFor(model => model.CashEntry.WeekEndingDate)

但我的问题是它会将其呈现为标记:

<input data-val="true" data-val-required="The WeekEndingDate field is required." id="CashEntry_WeekEndingDate" name="CashEntry.WeekEndingDate" type="text" value="" />

什么时候真正需要 data-val-required 应该是 data-val-date 。这也在日期字段的页面上搞砸了验证。关于为什么会发生这种情况的任何想法?

【问题讨论】:

    标签: asp.net-mvc data-annotations


    【解决方案1】:

    我担心 ASP.NET MVC 3 永远不会创建 data-val-date,这里是可能创建的属性列表:

    • 数据验证号
    • data-val-equalto
    • 数据验证范围
    • 数据-val-正则表达式
    • 数据验证远程
    • 需要数据验证
    • 数据值长度

    您可以像这样为 DataType 属性创建额外的 ModelValidatorProvider:

    public class ClientDataTypeNameModelValidatorProvider : ModelValidatorProvider
    {
        public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
        {
            if (metadata == null)
                throw new ArgumentNullException("metadata");
    
            if (context == null)
                throw new ArgumentNullException("context");
    
            if (metadata.DataTypeName == "Date")
                yield return new DateModelValidator(metadata, context);
        }
    
        internal sealed class DateModelValidator : ModelValidator
        {
            public DateModelValidator(ModelMetadata metadata, ControllerContext controllerContext)
                : base(metadata, controllerContext)
            { }
    
            public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
            {
                ModelClientValidationRule rule = new ModelClientValidationRule()
                {
                    ValidationType = "date",
                    ErrorMessage = "[Put your error message here]"
                };
    
                return new ModelClientValidationRule[] { rule };
            }
    
            public override IEnumerable<ModelValidationResult> Validate(object container)
            {
                // No server-side validation logic
                return Enumerable.Empty<ModelValidationResult>();
            }
        }
    }
    

    并像这样在您的 Global.asax 中注册它:

    ModelValidatorProviders.Providers.Add(new ClientDataTypeNameModelValidatorProvider());
    

    这应该为您提供对 DataType.Date 的客户端验证支持,但您必须记住,它仅适用于 jQuery 验证,因为 Microsoft 验证没有日期规则。

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多