2011-04-14 65 views
0

我有一个看起来像这样一个简单的模型对象:MVC DataAnnotation渲染错误HTMLin MVC3

[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。这也在日期字段的页面上搞砸了验证。任何想法为什么这可能会发生?

回答

2

我affraid ASP.NET MVC 3从不创建数据-VAL-日期,这里是可能创建的属性列表:

  • 数据-VAL-数
  • 数据-VAL-equalto
  • 数据-VAL-范围
  • 数据-VAL-正则表达式
  • 数据-VAL-远程
  • 数据-VAL-需要
  • 数据-VAL-长度

您可以像此数据类型的属性创建额外的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验证对日期没有规则。