【问题标题】:ModelBinder is not invoked未调用 ModelBinder
【发布时间】:2011-04-16 10:27:19
【问题描述】:

根据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:我还尝试用[ModelBinder(typeof(IEnumerableOfIntCSVModelBinder))] 装饰idArgs 动作参数和控制器,但这没有效果。

【问题讨论】:

  • 如果您将操作改回 ShowMany,它会再次起作用吗?
  • 我只是仔细检查过,它没有。
  • 我没有具体的答案,但如果它以前可以工作但现在不行,并且您正在有效地使用源代码控制,也许您可​​以查明代码从工作到不工作的提交.
  • 您好 - 您是否有机会“一分为二”您的源代码控制历史记录,以找到此问题所在的提交?考虑到变量的数量,可能是最快的答案。
  • 是的,先生,这个主意不错。不幸的是,这个项目需要完成的工作比使用合适的模型绑定器要多,所以我很可能只解析控制器中的字符串。

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


【解决方案1】:

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

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

【讨论】:

  • 是的,JsonValueProvider 似乎确实是一个可能的候选者......上周也有,但请求可能有所不同。路由不匹配只是前面示例中复制粘贴的产物,它们实际上是匹配的。
  • 我注释掉了JsonValueProvider,但是modelbinder仍然没有被调用......不知道这里发生了什么,我想我将不得不放弃它。
  • @notJim,如果你有机会把你的项目发给我,我可以看看它有什么问题(虽然没有时间保证)。
  • 你真大方,但恐怕我做不到。
【解决方案2】:

您可以尝试移动您的路线以成为第一个注册的路线吗?我刚刚尝试对此进行编码,并且遇到了一个问题,即我的路由没有触发,直到我将它的注册移到默认路由注册之上。路由似乎按照它们注册的顺序运行,因此如果您在注册后进行更具体的注册和更一般的注册,它可能不会触发。

在这个例子中,第二条路由永远不会被调用:

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”就会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多