Посмотрите на эту статью 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;
}
}
EDIT: В соответствии с @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