Web API 2 十进制分隔符

本文关键字:分隔符 十进制 API Web | 更新日期: 2023-09-27 17:55:48

如何为十进制数创建模型绑定器,如果用户以错误的格式发送,它将引发异常?

我需要这样的东西:

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

Web API 2 十进制分隔符

看看这篇文章 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)
{
}