如何爲十進制數字創建一個模型聯編程序,如果用戶以錯誤的格式發送它會引發異常?Web Api 2小數分隔符
我需要的是這樣的:
2 = OK
2.123 = OK
2,123 = throw invalid format exception
如何爲十進制數字創建一個模型聯編程序,如果用戶以錯誤的格式發送它會引發異常?Web Api 2小數分隔符
我需要的是這樣的:
2 = OK
2.123 = OK
2,123 = throw invalid format exception
看看這篇文章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)
{
}
如果綁定到'decimal'類型將不會成功,異常將以任何方式拋出。 – Fabio
是的,這是有道理的,但你想要默認。它應該做什麼。你測試過了嗎? – Liam
@fabio這是不正確的。我只是測試它。這是文化的依賴。我已經發送了10.5到我的api,並且它綁定得很好,但是當我發送10,5時,它沒有拋出任何異常。它只是將我的模型中的十進制值設置爲0,這是默認的十進制值。 – Robert