在每个my previous question中,我实现了一个模型绑定器,它将/api/v1/widgets/1,2,3映射到
// WidgetsController.cs:
public ActionResult Show(IEnumerable<int> idArgs)
{
}这是一段时间的工作,但现在不再是了。My 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动作参数和控制器,但这没有效果。
发布于 2011-04-02 07:23:51
我看到您的Application_Start中添加了一个Application_Start。也许在这个工厂的实现中有什么东西可以防止模型粘合剂被击中呢?
另外,您向/api/v1/widgets/1,2,3显示的url与您拥有"restapi/{controller}/{idArgs}"的路由定义没有任何关系。
发布于 2011-04-16 02:27:19
你能试着把你的路线移到第一条注册吗?我只是尝试编码这一点,并有一个问题,我的路线没有开火,直到我把它的注册高于默认的路由注册。路线似乎是按照他们注册的顺序运行的,所以如果你在注册后有了更具体的注册,并且注册的更一般,它可能不会开火。
在本例中,第二条路由从未被调用:
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+,?$" });但是如果你改变了他们的顺序,那么“if”就会被调用。
https://stackoverflow.com/questions/5519548
复制相似问题