2013-01-18 16 views
7

通貨フィールドのWebページでエラー(「額は数値でなければなりません)」が表示されます。それはドル記号($ 50.00)のためです。ASP.NET MVC 4通貨フィールド

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

@Html.EditorFor(model => model.Amount) 

ドル記号を維持するには、ほかに何が必要ですか?

+0

現在のカルチャ –

答えて

7

デフォルトのMVCモデルバインダーcannot parse value formatted for display。ああ

ModelBinders.Binders.Add(typeof(Foo), new FooModelBinder()); 

、そして最後:

public class FooModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider.GetValue("Amount"); 

     if (result != null) 
     { 
      decimal amount; 
      if (Decimal.TryParse(result.AttemptedValue, NumberStyles.Currency, null, out amount))     
       return new Foo { Amount = amount };         

      bindingContext.ModelState.AddModelError("Amount", "Wrong amount format");     
     } 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

はのApplication_StartでFooのタイプのために、このバインダーを追加:だから、あなたはあなた自身のモデルバインダーを書いて、このタイプのためにそれを登録する必要があります(と仮定するタイプ名はFooのです)事 - 量のテキストボックス(そうしないと、それは数ではありませんメッセージを見ていきます)からdata-val-number属性を削除:

$("#Amount").removeAttr("data-val-number"); 

今、あなたは検証エラーmessagを取得しますe入力値が正しい通貨量(たとえば、 $10F.0)。


ところで、私はそれがMVCカスタムフォーマットされた文字列をバインド支援するために、すべてのこのようなものを実装するよりも、ApplyFormatInEditMode = falseを使用する方が良いと思います。

0

System.ComponentModel.DataAnnotations.RegularExpressionAttributeを使用できます。

0

また、編集モードをfalseに設定することもできます。次に、テキストがフォーマットされる間に10進値のみが表示されます。

ApplyFormatInEditMode = false