2013-01-18 93 views
7

我在貨幣字段的網頁上出現錯誤(「字段金額必須是數字」)。這是因爲美元符號(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。所以,你應該寫自己的模型綁定,並將其註冊爲這種類型(假設類型名是foo):

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的類型添加這種粘合劑:

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

啊,和去年事情 - 從量文本刪除data-val-number屬性(否則你會看到繼續消息這不是一個數字):

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

現在你會得到驗證錯誤messag e如果輸入值不是正確的貨幣量(例如, $10F.0)。


BTW我認爲這是更好地使用ApplyFormatInEditMode = false不是執行所有這些東西來幫助MVC綁定您的自定義格式的字符串。

0

您可以使用System.ComponentModel.DataAnnotations.RegularExpressionAttribute。

0

您還可以將編輯模式設置爲false。然後它將只顯示小數值,而文本將被格式化。

ApplyFormatInEditMode = false