2011-05-24 21 views
8

在我的模型中,我有以下小數?屬性:.NET MVC 3自定義十進制? Model Binder

public decimal? Budget { get; set; } 

我意識到我需要小數其哈克在以下鏈接提供的自定義模型聯:http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

我已經修改了自己的代碼,以便如果傳入的值確實包含貨幣符號和/或逗號,那麼我將它剝離並嘗試將其轉換爲小數。這有效,但是因爲我的屬性是一個可爲空的十進制類型,我也希望它不接受任何東西,並沿着它的快樂方式插入數據庫中的該列中插入null。現在它插入一個0.00。我知道我在代碼中丟失了一些東西,但是腦部凍結。

這裏的粘結劑代碼:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    object newValue = null; 
    try 
    { 
     if (!string.IsNullOrEmpty(valueResult.AttemptedValue)) 
     { 
      newValue = valueResult.AttemptedValue.Replace("$", "").Replace(",", ""); 
     } 

     actualValue = Convert.ToDecimal(newValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
} 

同樣,我們的目標是有小數點?像通常那樣行事,但是如果有一個包含貨幣符號和/或逗號的值,並且它可以轉換爲小數點然後返回。

感謝

回答

1

在try塊,我想你需要像

string valToCheck = valueResult.AttemptedValue; 
if(valToCheck == string.Empty) 
{ 
    actualValue = null; 
} 
else 
{ 
    actualValue = Convert.ToDecimal(valToCheck.Replace("$", string.Empty), CultureInfo.InvariantCulture); 
} 

在代碼中,你總是設置actualValue到ToDecimal的結果()。

8

您可能最好利用內置支持來處理NumberStyles。通過這樣做,您可以解釋的不只是普通的美元符號,還可以處理磅,日元等...

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.IsNullOrWhiteSpace(valueResult.AttemptedValue)) 
      actualValue = Decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
}