Asp.net 小数的 MVC 自定义模型绑定器 - 当小数操作参数为 null 时添加模型错误

Asp.net MVC Custom Model Binder for decimals - adds model error when decimal action param is null

我根据 Haacked 的一篇文章创建了一个自定义模型活页夹。这是代码:

namespace MyNamespace.Project.ModelBinders
{
    public class DecimalModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            string modelName = bindingContext.ModelName;
            ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(modelName);

            ModelState modelState = new ModelState { Value = valueResult };

            object actualValue = null;

            try
            {
                //replace commas with periods
                actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Replace(",", "."));
            }
            catch (Exception ex)
            {
                modelState.Errors.Add(ex);
            }

            bindingContext.ModelState.Add(modelName, modelState);

            return actualValue;
        }
    }
} 

当 MVC 加载一个视图时,控制器的动作是这样的:

public ActionResult Index(decimal amount)  

它似乎触发了模型绑定并添加了错误,这是因为此时的数量为空,因为我有一个有效的用例,其中可以使用或不使用参数 (QueryString) 加载索引。据我所知,MVC 不支持典型的 OO 方法重载,因此您有:

public ActionResult Index(decimal amount) {}  
public ActionResult Index() {}  

那么,向我的自定义模型联编程序添加空检查以避免 try 块中引发的错误是否有效,或者这会干扰验证吗?

总的来说,我在这里看到了多个要点。第一个是关于这个的:

As far as I know MVC doesn't support typical OO method overloading...

没错,但它有一个非常灵活的路由配置来帮助解决此类问题。

您可以为有参数或没有参数的调用配置单独的路由。我没试过,但这是一个使用 Attribute Routing.

的示例
[Route("index/{amount}"]
public ActionResult IndexWithAmount(decimal amount) {}  

[Route("index")]
public ActionResult Index() {}

您可以做的另一件事是 described here 不在全局范围内使用模型绑定器,而是仅在特定路由上启用它:

public ActionResult Index(
    [ModelBinder(typeof(DecimalModelBinder))]decimal amount) {}