2011-04-14 46 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驗證對日期沒有規則。