MVC数据注释呈现错误的HTML MVC3

时间:2011-04-14 13:54:23

标签: asp.net-mvc data-annotations

我有一个直观的模型对象,如下所示:

[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时,应该是data-val-date。这也在日期字段的页面上搞砸了验证。有关为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

我很害怕ASP.NET MVC 3从不创建data-val-date,这里是可能创建的属性列表:

  • 数据-VAL-数
  • 数据-VAL-equalto
  • 数据-VAL-范围
  • 数据-VAL-正则表达式
  • 数据-VAL-远程
  • 数据-VAL-需要
  • 数据-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验证没有日期规则。