2012-05-19 242 views
6

我指的是這篇文章:客戶端驗證Asp.Net MVC 4

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

它展示瞭如何在Asp.Net MVC創建自定義的註釋。然而,客戶端驗證腳本,特別是「MicrosoftMvcJQueryValidation」在Asp.Net MVC4中不可用。我在一篇文章中讀到它是Asp.Net Futures項目的一部分。我想用Jquery連接我的客戶端驗證。在我的項目模板腳本的文​​件夾中,我看到腳本命名爲:

jquery.validate.min.js 
jquery.validate.unobtrusive.min.js 
jquery.unobtrusive-ajax.min.js 

有什麼辦法,我可以利用這些現有的腳本嗎?還是我必須強制下載期貨項目?

+1

谷歌「MVC 3自定義驗證」,你會發現像http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvccustomvalidation_topic3和http://tdryan.blogspot.com/2010/12/aspnet- mvc-3-custom-validation.html – RickAndMSFT

+0

@RickAndMSFT:當你在沒有閱讀的問題上盲目地發佈鏈接時,會發生這種情況。 http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvccustomvalidation_topic3不是關於Jquery驗證。它使用MicrosoftMvcValidation.js進行客戶端驗證,我不需要,因爲我明確提出了問題,並且http://tdryan.blogspot.in/2010/12/aspnet-mvc-3-custom-validation.html使用內置RegularExpressionAttribute自動生成客戶端腳本。我沒有使用RegularExpressionAttribute。根據你的鏈接,我最好不要谷歌:D –

+1

閱讀任何我的教程下面的迴應。爲MVC 4更新它們並不難。概念是相同的。 – RickAndMSFT

回答

14

該文章特定於使用MicrosoftAjax的MVC 2。 MVC 4不再包含MS Ajax文件,因爲它們已被棄用,首選的方法是使用jQuery。

要驗證設置,確保這些腳本是在你的佈局

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 

而這兩個設置存在於appSettings部分在web.config文件

<add key="ClientValidationEnabled" value="true"/> 
<add key="UnobtrusiveJavaScriptEnabled" value="true"/> 

所以,當你添加數據註釋到您的ViewModels您可以獲得客戶端和服務器端驗證兩者

public class MyModel 
{ 
    [Required] 
    [StringLength(30)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(30)] 
    public string LastName { get; set; } 
} 

在你看來只是確保你有一個像這樣

<div> 
    @Html.LabelFor(model => model.FirstName) 
</div> 
<div> 
    @Html.TextBoxFor(model => model.FirstName) <br/> 
    @Html.ValidationMessageFor(model => model.FirstName) 
</div> 

<div> 
    @Html.LabelFor(model => model.LastName) 
</div> 
<div> 
    @Html.TextBoxFor(model => model.LastName) <br/> 
    @Html.ValidationMessageFor(model => model.LastName) 
</div> 

更新

下面的代碼是,我已經叫RateRequiredIfCustomIndexRate 一個自定義驗證的例子這是它的JavaScript端,使其被添加到jquery驗證

$("document").ready(function() { 

    var isCustomRateRequired = document.getElementById("IsCustomRateRequired"); 

    isCustomRateRequired.onchange = function() { 
     if (this.checked) { 
      $('#Rate').attr('disabled', 'disabled'); 
      $('#Rate').val(''); 
     } 
     else { 
      $('#Rate').removeAttr('disabled'); 
     } 
    }; 
}); 

jQuery.validator.addMethod("raterequiredifcustomindexrate", function (value, element, param) { 
    var rateRequired = $("#CustomRateRequired").val(); 
    if (rateRequired && value == "") { 
     return false; 
    } 
    return true; 
}); 

jQuery.validator.unobtrusive.adapters.addBool("raterequiredifcustomindexrate"); 
+0

那麼,如何使用這些腳本來連接我的客戶端驗證?任何教程?文章? –

+0

這很簡單,你得到免費的:-)當你與數據註解裝飾你的視圖模型類,這些相同的規則會轉換到客戶端規則..更新我的答案現在 –

+0

這真的可能嗎?這是我的自定義驗證註釋。我已經擴展使用*** ValidationAttribute ***我的C#代碼服務器端驗證如何自動轉換爲JQuery語言?我好奇。 –

10

這裏缺少的關鍵是服務器端驗證器必須實現IClientValidatable接口:

public class RateRequiredIfCustomIndexRateAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     return false; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     yield return new ModelClientValidationRule 
     { 
      ErrorMessage = this.ErrorMessage, 
      ValidationType = "raterequiredifcustomindexrate" 
     }; 
    } 
} 

一旦你這樣做,客戶端驗證應該正確地連接起來。您可以通過確保您的輸入字段具有屬性「data-val-raterequiredifcustomindexrate」屬性來驗證此情況。