2016-01-29 68 views
1

我驗證了Html.TextBoxFor。這裏是我的看法asp.net mvc美元貨幣驗證註釋

@Html.TextBoxFor(m => m.Amount, new {@class = "form-control", Value = String.Format("{0:C}", Model.Amount) }) 

此代碼需要從數據庫5000.00一樣,並顯示在用戶界面上的雙重價值爲$ 5,000.00代碼。但是,當用戶點擊提交按鈕時,顯示驗證錯誤

值'$ 5,000.00'對金額無效。該示範

我的驗證註解是

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid dollar amount")] 

爲了得到它提交,我不得不重新鍵入爲5000.00。我怎樣才能解決這個問題?謝謝。

+1

取看看這個http://stackoverflow.com/questions/34550361/how-do-i-properly-format-a-readonly-textboxfor-value-as-currency – Shyju

回答

0

您可以創建自己的Binder對象來處理這個。首先,創建該對象:

public class DoubleModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     if (!string.IsNullOrEmpty(valueResult.AttemptedValue)) 
     actualValue = Convert.ToDouble(valueResult.AttemptedValue.Replace("$", ""), System.Globalization.CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    if (bindingContext.ModelState.ContainsKey(bindingContext.ModelName)) 
     bindingContext.ModelState[bindingContext.ModelName] = modelState; 
    else 
     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

然後在在Application_Start功能時,您的Global.asax.cs文件,補充一點:當你在htmlAttributes的value = string.Format("{0:C}", Model.Amount)

ModelBinders.Binders.Add(typeof(double?), new DoubleModelBinder()); 
1

,剃刀將執行C#代碼並返回值"$125.67"(假設Amount屬性的值爲125.67M),它是一個字符串。因此,通過您的視圖生成的標記將

<input value="$125.67" class="form-control" id="Amount" name="Amount" type="text"> 

現在既然$125.67不是不是的Valide十進制值,而是一個字符串。它不能將此文本框的值映射到您的視圖模型的Amount屬性,該屬性爲十進制/雙重類型。

你可以做的是,在你的視圖模型中創建一個新的屬性來存儲這個格式化的字符串值,當用戶提交表單時,嘗試將它解析回一個十進制變量並使用它。

因此,一個新的屬性添加到您的視圖模型

public class CreateOrderVm 
{ 
    public int Id { set;get;} 
    public string AmountFormatted { set;get;} // New property 
    public decimal Amount { set;get;} 
} 

而且在你看來,這是強類型到CreateOrderVm

@model CreateOrderVm 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.AmountFormatted, new { @class = "form-control", 
           Value = String.Format("{0:C}", Model.Amount) }) 

    <input type="submit" /> 
} 

而在你HttpPost行動

[HttpPost] 
public ActionResult Create(CreateOrderVm model) 
{ 
    decimal amountVal; 

    if (Decimal.TryParse(vm.AmountFormatted, NumberStyles.Currency, 
              CultureInfo.CurrentCulture, out amountVal)) 
    { 
     vm.Amount = amountVal; 
    } 
    else 
    { 
     //add a Model state error and return the model to view, 
    } 

    //vm.Amount has the correct decimal value now. Use it to save 
    // to do :Return something 
}