2013-07-18 93 views
5

我有這個貨幣領域的ASP.NET MVC-4的應用程序:如何驗證貨幣字段?

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)] 
    [DataType(DataType.Currency)] 
    public decimal? Price { get; set; } 

這在我看來是相應的部分:

@Html.EditorFor(model => model.Price) 
    @Html.ValidationMessageFor(model => model.Price) 

如果價格是100歐元的文本字段該視圖顯示了:

100,00€

這很好。

但是當我嘗試做回發時,我遇到了問題。驗證器彈出並說價格字段需要是一個數字。

我只能解決這個問題,如果(1)我刪除€符號和(2)替換小數點分隔符(用逗號替換逗號)。

如果沒有更好的解決方案,我想我可以更改DataFormatString =「{0:F2}」以避免貨幣符號。

但我該如何讓驗證器接受逗號而不是(美式)點的小數點分隔符?

感謝您的幫助,夥計們!

+1

我想你需要做一個自定義模型聯編程序檢查此鏈接http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals。aspx – Overmachine

+0

@Overmachine:謝謝你的評論。但我認爲ModelBinder不會解決驗證器問題。換句話說:我仍然希望客戶端驗證 - 驗證器仍然會失敗(有或沒有ModelBinder),我錯了嗎? – Ingmar

+0

客戶端驗證仍然可以正常工作,問題在於您在回發郵件時發送貨幣符號。 – Overmachine

回答

1

所以,我能夠解決我的問題與jQuery的全球化插件從http://github.com/jquery/globalize

我添加下列文件到我的/腳本文件夾:

  • /scripts/globalize.js
  • /scripts/cultures/globalize.cultures.js
  • /sctipts /文化/ globalize.culture.de-DE.js

BundleConfig.cs

bundles.Add(new ScriptBundle("~/bundles/scripts/globalization").Include(
      "~/Scripts/globalize*", 
      "~/Scripts/cultures/globalize*")); 

_Layout.cshtml

@Scripts.Render("~/bundles/scripts/globalization") 

_Layout.cshtml的腳本部分:

$.validator.methods.number = function (value, element) { 
      return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
     } 
     $.validator.methods.range = function (value, element, param) { 
      return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
     } 

但是,我不能讓貨幣符號與客戶端驗證一起工作,所以我還更改了數據註釋,如下所示:

[DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}", ConvertEmptyStringToNull = true)] 

但就是這樣。沒有其他必要的更改。現在我可以輸入「1,49」或「18,77」等值,並且所有內容都可以正確存儲在我的數據庫中。