2

我們已經爲它下面的數據註釋屬性添加數據類型的客戶端驗證在MVC不靈2

[Required] 
[DataType(DataType.Date, ErrorMessage = "Please enter date")] 
[DisplayName("Date Released")] 
public object DateReleased { get; set; } 

稱爲DateReleased屬性以下是其實現爲插入新記錄到數據庫的操作

[HttpPost] 
public ActionResult Create([Bind(Exclude="Id")] Movie movie) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      _entities.AddToMovies(movie); 
      _entities.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(movie); 
    } 
    catch 
    { 
     return View(); 
    } 
} 

我已啓用客戶端驗證,通過將下面的代碼行中創建視圖

<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script> 
<script type="text/javascript" src="../../Scripts/jquery.validate.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.js"></script> 

<% Html.EnableClientValidation(); %> 

但我很驚訝地發現,只有需要驗證是在客戶端觸發。 Date的數據類型驗證僅在服務器端觸發。請讓我知道客戶端驗證失敗背後的原因,以及什麼是解決客戶端驗證的解決方法。

+0

如果你確實需要大量的客戶端驗證,我建議你升級到MVC3,它有更好的基於jquery.validate的驗證。在我看來,這樣做不那麼麻煩。 –

回答

4

是的。添加自定義屬性類,如下

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class DateAttribute : DataTypeAttribute 
{ 
    public DateAttribute() : base(DataType.Date) { } 

    public override string FormatErrorMessage(string name) 
    { 
     if (ErrorMessage == null && ErrorMessageResourceName == null) 
     { 
      ErrorMessage = ValidatorResources.DateAttribute_Invalid; 
     } 
     return base.FormatErrorMessage(name); 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) return true; 
     DateTime retDate; 
     return DateTime.TryParse(Convert.ToString(value), out retDate); 
    } 
} 

創建客戶端驗證規則類

public class ModelClientValidationDateRule:ModelClientValidationRule 
{ 
    public ModelClientValidationDateRule(string errorMessage) 
    { 
     ErrorMessage = errorMessage; 
     ValidationType = "date"; 
    } 
} 

創建一個適配器類鉤在下面的自定義屬性和客戶端驗證規則。確保添加上述屬性類的refernce的

public class DateAttributeAdapter : DataAnnotationsModelValidator<DateAttribute> 
{ 
    public DateAttributeAdapter(ModelMetadata metadata, ControllerContext context, DateAttribute attribute) 
     : base(metadata, context, attribute) { } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     return new[] { new ModelClientValidationDateRule(ErrorMessage) }; 
    } 
} 

然後修改Global.asax文件

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DateAttribute), typeof(DateAttributeAdapter)); 
} 

添加屬性的模型類,如下

[Date] 
public object DateReleased { get; set; } 

添加下面的客戶端在視圖中的代碼

<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script> 
<script type="text/javascript" src="../../Scripts/jquery.validate.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script> 
<script type="text/javascript" src="../../Scripts/MicrosoftMvcValidation.js"></script> 
<script type="text/javascript"> 

Sys.Mvc.ValidatorRegistry.validators["date"] = function (rule) { 
    // initialization code can go here. 
    return function (value, context) { 
     if (value.length > 0) { 
      var d = new Date(value); 
      if (!isNaN(d)) 
       return true; 
      return rule.ErrorMessage; 
     } 
     else { 
      return true; 
     } 
    }; 
}; 

希望這會對你有所幫助。

+0

是的,它的確行得通 – suryakiran

3

DataTypeAttribute不進行驗證。它僅用於選擇Editor/DisplayTemplates(從而控制數據的格式),也用於在通用模板中進行格式選擇。

我不知道你爲什麼認爲這做了任何形式的驗證,但事實並非如此。控制驗證是什麼實際的數據類型。由於您創建的數據項爲object,因此無法執行日期格式的任何修改。相反,讓你的屬性輸入DateTime?或可空值

+0

我已將這些屬性重新定義爲由ADO.Net實體框架生成的部分類。我甚至用DateTime替換了該對象,但驗證不起作用。我需要在客戶端進行有效日期驗證。 – suryakiran

+0

@suryakiran - 如果你的屬性類型是DateTime ?,它將驗證它是否是有效的日期格式,但不是它是你的目的的有效日期。如果您需要驗證日期是否在某個範圍內,那麼您必須編寫自己的屬性。此外,您將需要編寫自定義日期驗證JavaScript以使用客戶端驗證。見http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx –