每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))]
动作参数和控制器,但这没有效果。
答案 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”就会被调用。