2016-07-08 48 views
0

如何爲十進制數字創建一個模型聯編程序,如果用戶以錯誤的格式發送它會引發異常?Web Api 2小數分隔符

我需要的是這樣的:

2 = OK 
2.123 = OK 
2,123 = throw invalid format exception 
+1

如果綁定到'decimal'類型將不會成功,異常將以任何方式拋出。 – Fabio

+0

是的,這是有道理的,但你想要默認。它應該做什麼。你測試過了嗎? – Liam

+0

@fabio這是不正確的。我只是測試它。這是文化的依賴。我已經發送了10.5到我的api,並且它綁定得很好,但是當我發送10,5時,它沒有拋出任何異常。它只是將我的模型中的十進制值設置爲0,這是默認的十進制值。 – Robert

回答

1

看看這篇文章http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx/

您可以用標準的粘合劑用簡單的檢查,這樣

public class DecimalModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 

     if (valueResult.AttemptedValue.Contains(",")) 
     { 
      throw new Exception("Some exception"); 
     } 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
      CultureInfo.CurrentCulture); 


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

編輯:據@Liam建議您必須首先將此活頁夾添加到您的配置中

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 

上面的代碼在壞小數分隔符的情況下會拋出異常,但您應該使用模型驗證來檢測那種錯誤。這是更靈活的方式。

public class DecimalModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 
     try 
     { 
      if (valueResult.AttemptedValue.Contains(",")) 
      { 
       throw new Exception("Some exception"); 
      } 
      actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
       CultureInfo.CurrentCulture); 
     } 
     catch (FormatException e) 
     { 
      modelState.Errors.Add(e); 
      return false; 
     } 

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

你不會拋出異常,只是添加驗證錯誤。您可以稍後在您的控制器中檢查它

if (ModelState.IsValid) 
{ 
} 
+0

他希望它拋出一個異常!你拋出一個異常,但然後趕上它.. – Liam

+0

你需要添加如何實際綁定這也是,即'ModelBinders.Binders.Add(typeof(十進制),新的DecimalModelBinder());' – Liam

+0

對於WebAPI2的'BindModel'方法返回'bool'。我們在這裏不使用MVC – suvroc