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) {}
我根据 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) {}