Per 我之前的问题 https://stackoverflow.com/questions/5228144/bind-action-1-2-3-to-listint,我实现了一个模型绑定器来映射/api/v1/widgets/1,2,3
to
// 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+,?$" }
);
Edit:我尝试过更多地弄乱路线,并注释掉JsonValueProvider
,但我仍然得到一个空数组。在我的控制器中,我可以做
var ids = RouteData.Values["idArgs"];
并得到字符串“1,2,3”。如果框架将其传递给我的 ModelBinder,我的 ModelBinder 会将其转换为IEnumerable
.
我正在使用 AutoFac。 AutoFac 是否有可能将空数组注入到我的控制器方法中?我在其他地方没有遇到过这样的问题(我们在这个项目中到处都使用 AutoFac。)
Edit2:我也尝试过装饰idArgs
动作参数,以及控制器[ModelBinder(typeof(IEnumerableOfIntCSVModelBinder))]
,但这没有效果。