不调用ModelBinder

时间:2011-04-01 22:28:57

标签: asp.net-mvc-2 autofac modelbinders

my previous question,我实施了一个将/api/v1/widgets/1,2,3映射到

的模型绑定器
// WidgetsController.cs: 
public ActionResult Show(IEnumerable<int> idArgs)
{

}

这已经有一段时间了,但现在已经不复存在了。 甚至根本没有调用我的ModelBinder。调用我的操作时,idArgs的值为空列表,即使我将其默认值设置为null这条路线,告诉我默认模型绑定器认为它从某个地方获得了一个值。自上周工作以来,我所做的唯一改变就是之前,我调用了我的行动ShowMany.从那时起,我将其重命名为Show。任何人都可以帮我弄清楚为什么我的ModelBinder没有被调用?

在global.asax.cs中,我有

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

    ModelBinders.Binders.Add(typeof(IEnumerable<int>), new IEnumerableOfIntCSVModelBinder());
}

路线看起来像这样(我已经确认正在使用这条路线):

context.MapRoute(
    "show",
    "api/{controller}/{idArgs}",
    new { action = "show" },
    new { httpMethod = new HttpMethodConstraint("GET"), idArgs = @"^(\d+,)+\d+,?$" }
);

编辑:我已经尝试过搞乱一些路线,以及评论JsonValueProvider,我仍然得到一个空数组。在我的控制器中,我可以做到

var ids = RouteData.Values["idArgs"];

并获取字符串“1,2,3”。如果只有框架将它传递给我的ModelBinder,我的ModelBinder会把它变成IEnumerable

我正在使用AutoFac。 AutoFac是否可能在我的控制器方法中注入一个空数组?我在其他地方没有这样的问题(我们在这个项目的每个地方都使用AutoFac。)


Edit2 :我还尝试使用idArgs装饰[ModelBinder(typeof(IEnumerableOfIntCSVModelBinder))]动作参数和控制器,但这没有效果。

2 个答案:

答案 0 :(得分:1)

我看到您在JsonValueProviderFactory中添加了Application_Start。也许在这个工厂的实现中有一些东西可以阻止模型绑定器被击中?

此外,您显示的网址/api/v1/widgets/1,2,3与您拥有"restapi/{controller}/{idArgs}"的路线定义无关。

答案 1 :(得分:0)

您是否可以尝试将您的路线移至第一个注册的路线?我只是尝试对此进行编码并遇到一个问题,我的路线没有开始,直到我将其注册移到默认路线注册之上。路由似乎按照注册顺序运行,因此如果您在注册后进行更具体的注册,则可能无法触发。

在此示例中,永远不会调用第二条路径:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

routes.MapRoute(
    "Ids",
    "{controller}/{action}/{ids}",
    new { controller = "Home", action = "Index", ids = UrlParameter.Optional },
    new { ids = @"^(\d+,)+\d+,?$" });

但如果你改变他们的顺序,那么“Ids”就会被调用。