2016-05-18 12 views
0

プロパティタイプを小数点または二重にする必要がある通貨入力を実装し、 "0.00,00"という形式を使用する必要があります。ブラジルのリアルMVC/DataAnnotation通貨

ViewModelに私はまた私のweb.config文化= "PT-BR" に設定している

@model Decimal? 

@Html.TextBox("", Model.HasValue && Model.Value > 0 ? Model.Value.ToString() : "", new { @class = "form-control text-box single-line money" }) 


<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".money").maskMoney({ thousands: '.', decimal: ',', prefix: "" }); 
    }); 
</script> 

[RegularExpression(@"^([1-9]{1}[\d]{0,2}(\.[\d]{3})*(\,[\d]{0,2})?|[1-9]{1}[\d]{0,}(\,[\d]{0,2})?|0(\,[\d]{0,2})?|(\,[\d]{1,2})?)$")] 
public Decimal Salario { get; set; } 

EditorTemplate。 問題は、入力が "123,98"のような値だけを受け入れることです。 "1.123,98"と入力すると、エラーメッセージ "9.999,99 'の値がSalarioに無効です。" ドットとカンマを許可する方法はありますか?私はSystem.Stringを使いたくありません。

UPDATE - ソリューション

私は最終的に解決策を見つけました!

EditorTemplate

@model Double? 

@Html.TextBox("", Model.HasValue && Model.Value > 0 ? Model.Value.ToString() : "", new { @class = "form-control text-box single-line money" }) 


<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".money").maskMoney({ thousands: '.', decimal: ',', prefix: "R$ "  }); 
    }); 
</script> 

のViewModel

[DataType("Money")] //Money is the name of my EditorTemplate 
public decimal Valor { get; set; } 

カスタムモデルバインダー

public class DoubleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 

     return valueProviderResult != null && !string.IsNullOrEmpty(valueProviderResult.AttemptedValue) ? Convert.ToDouble(valueProviderResult.AttemptedValue.Replace("R$", "").Trim()) : base.BindModel(controllerContext, bindingContext); 
    } 
} 

Global.asaxの

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
ModelBinders.Binders.Add(typeof(double?), new DoubleModelBinder()); 
:これは私の最終的なコードです

このカスタムモデルバインダーは、値をコントローラーに送る前に値をフォーマットするために使用されます。私はこの記事の解決策を見つけました:Accept comma and dot as decimal separator

ありがとうございます!

+0

スクリプトは 'EditorTemplate'になることはありませんdisplayFormatにアノテーションを使用してフィールドのです。あなたは控えめなクライアント側の検証を使用していますか(つまり、フォームの送信を妨げる検証エラーを受け取ります。この場合、 '$ .validator'を再設定する必要があります)、またはサーバー上で行われている検証です。サーバカルチャ) –

+0

コメントとして、おそらく最小のサブユニットに通貨を 'int'として格納しておくべきでしょう。 –

答えて

0

Currency Formatting MVCDarin Dimitrovを提供しています。メインビューにそれを動かす - キーがDataAnnotationの

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

重複していると思われる場合は、そのままフラグを立てます。しかし、これはとにかくOPの問題とは関係ありません(これはバリデーションと関係します) –

+0

私はすでにこれを試しましたが、うまくいきませんでした。 –