2016-07-29 43 views
0

我有一個像下面產品價格回報FASLE的是ModelState中有效

class Product{ 
    public string ProductName {get;set;} 
    public decimal ProductPrice {get;set;} 

} 

,並在查看我指的模式頂部

,並使用Lamba expression創建輸入

@Html.TextBoxFor(n => n.Transaction.ProductName) 
@Html.TextBoxFor(n => n.Transaction.ProductPrice) 

,所有的工作,現在當我輸入1.11到產品的價格,它工作正常

但如果我輸入類似240,000ModelState is not valid

這是爲什麼?什麼是正確的方法來做到這一點?如何創建僅處理價格的文本框?並沒有文字輸入?

+0

因爲逗號,逗號不是有效的數值 – Sherlock

+0

以及1.11和1.11不同,不知道是否會影響你的代碼但也許嘗試 – Neil

+0

@ J.Steen是的,他/她可以在使用javascript提交表單之前預先格式化值。我不確定這是否是理想的方式 – Sherlock

回答

0

看起來您的問題可能是「240,000」中的逗號。你有兩個選擇:

(一)限制文本框的數字字符只有

@Html.TextBoxFor(n => n.TransactionProductPrice, new { type = "number" }) 

(二)改變ProductPrice類型爲字符串,然後解析用逗號分隔的數千到字符串在控制器端十進制(見本其他question求救這樣做)

var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands); 
var price = Decimal.Parse(viewmodel.TransactionProductPrice, allowedStyles); 
0

試着改變你的,(逗號)。(點)

在C#中使用它。(點)爲十進制v alues(不是類型,實際的十進制值)
而是使用字符串格式化你的價值觀轉換從2016000.5到2 016 000,5或2,016,000.5如果這是你在找什麼

1

試圖實現自定義的模型綁定十進制數據類型將解析十進制值相應於當前的文化:

public class PriceModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = value }; 

     decimal result = 0.0M; 
     if (!decimal.TryParse(value.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture, out result)) 
      modelState.Errors.Add(new FormatException("Price is not valid")); 

     return result; 
    } 
} 
+0

是的。使用'IModelBinder'是正確的方法。 +1 –