2012-03-24 76 views
0

我嘗試在一個非常簡單的例子上使用客戶端驗證,它不起作用。我從一個來自互聯網的現有例子開始。客戶端驗證沒有在一個非常簡單的例子上工作

這是(見接受的答案):ASP .Net MVC 3 unobtrusive custom client validation

基本上,它使用這個博客作爲解決方案:http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/

所以我從一個空白的解決方案開始,想驗證一個價格高於最低限度。

我的控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(MinPriceViewModel model) 
    { 
     if (!ModelState.IsValid) 
      return View(model); 

     return Content("Thank you very much"); 
    } 
} 

我的視圖模型:

public class MinPriceViewModel 
{ 
    [MinPrice(MinPrice=9.99)] 
    [Required] 
    public double Price { get; set; } 
} 

進行驗證的屬性(客戶機服務器&):

public class MinPriceAttribute : ValidationAttribute, IClientValidatable 
{ 
    public double MinPrice { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return true; 

     var price = Convert.ToDouble(value); 

     if (price < MinPrice) 
     { 
      return false; 
     } 

     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return "Attention le champ " + name + " ne contient pas un prix acceptable."; 
    } 

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

的視圖:

@model MinPriceValidation.Models.MinPriceViewModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 

<script src="../../Scripts/jquery.validate.js" type="text/javascript"></script> 
<script src="../../Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(function() { 
     jQuery.validator.unobtrusive.adapters.addBool('minprice'); 
    }); 
</script> 

@using(Html.BeginForm()) 
{ 
    @Html.LabelFor(m => m.Price) 
    @Html.TextBoxFor(m => m.Price) 
    @Html.ValidationMessageFor(m => m.Price) 

    <input type = submit /> 
} 

我在我的控制器的後置操作中放置了一個斷點,以檢查是否發生了客戶端或服務器驗證。當我運行解決方案並輸入1並提交時,在我的控制器中達到了斷點(發佈後操作)>>我的結論是客戶端驗證從不使用。

我不明白,因爲我從基本的例子(信用卡驗證)開始,並且我知道這個信用卡驗證在客戶端驗證(我在另一個解決方案中測試過)中起作用。

我有點失落。

任何想法爲什麼客戶端驗證不起作用?

謝謝。


UPDATE

google搜索了很多之後,我看到一些人告訴我們需要一個JavaScript函數的客戶端驗證這樣的:

jQuery.validator.addMethod("minprice", function (value, element, param) { 
     // Perform tests here for client validation 
     return (value>10); 
    }); 

    jQuery.validator.unobtrusive.adapters.addBool('minprice'); 

當我與這個加考JavaScript函數它的工作原理,但我覺得奇怪的是,創意卡的例子沒有在視圖中檢查信用卡的任何JavaScript函數!

我仍然迷路。

回答

1

當你說你看到使用這種信用卡的人及它的工作原理不需要自定義JavaScript函數我想你正在接受following post

A credit card validation rule直接內置在jquery validate插件中。這就是爲什麼你不需要編寫自定義驗證功能。

minprice規則而言,沒有這樣的事情,所以您需要編寫自定義javascript函數來定義什麼是minprice

這是說我讓你是重新發明一些輪具有這種屬性的感覺,你可以簡單地做:

[Range(9.99, double.MaxValue)] 
[Required] 
public double Price { get; set; } 

因爲我們正在談論價格,建議在使用小數型您的型號:

[Range(9.99, double.MaxValue)] 
[Required] 
public decimal Price { get; set; } 

現在您將獲得自動的客戶端和服務器端驗證。

+0

Yuo是對的。我不知道。謝謝。 – Bronzato 2012-03-25 08:48:29

+0

這有效,但當最低價格發生變化時,您需要程序員更改代碼。這是一個營銷規則,應該是動態的,並且在沒有重建/重新部署應用程序的情況下由非程序員改變。 – RickAndMSFT 2012-03-25 16:52:22

1

確保這些設置在web.config中爲真:

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

而且這個腳本包括在頁面:

<script src="@Url.Content("~/Scripts/jquery-1.5.1.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> 
+0

是的,設置在我的web.config是正確的,是的,包括腳本,但仍然沒有運氣。不管怎麼說,還是要謝謝你。 – Bronzato 2012-03-24 11:15:22

+0

已更新。可能是因爲你的收益回報。 – 2012-03-24 11:45:03

+0

更改爲列表<....也不起作用。 – Bronzato 2012-03-24 11:58:11

相關問題