【发布时间】: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