2013-07-18 21 views
5

私はこの通貨フィールドでのASP.NET MVC-4のアプリケーションを持っている:通貨フィールドを検証するにはどうすればよいですか?

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

これは、対応する私の見解では一部です:価格は100ユーロテキストフィールドにある場合

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

ビューを示しています。

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

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

@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」のような値を入力でき、すべてがデータベースに正しく格納されます。