首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不调用ModelBinder

不调用ModelBinder
EN

Stack Overflow用户
提问于 2011-04-01 22:28:56
回答 2查看 702关注 0票数 3

在每个my previous question中,我实现了一个模型绑定器,它将/api/v1/widgets/1,2,3映射到

代码语言:javascript
复制
// WidgetsController.cs: 
public ActionResult Show(IEnumerable<int> idArgs)
{

}

这是一段时间的工作,但现在不再是了。My ModelBinder甚至根本没有被调用。当调用我的操作时,idArgs有一个空列表的值,即使我在路由中将其默认值设置为null,这表明默认的模型绑定器认为它是从某个地方得到的值。自从上周它开始工作以来,我所做的唯一改变就是,从那时起,我就调用了操作ShowMany.,我将它重命名为Show。有人能帮我找出为什么我的ModelBinder没有被调用吗?

在global.asax.cs,我有

代码语言:javascript
复制
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

    ModelBinders.Binders.Add(typeof(IEnumerable<int>), new IEnumerableOfIntCSVModelBinder());
}

这条路线看上去是这样的(我已经证实这条路线正在使用):

代码语言:javascript
复制
context.MapRoute(
    "show",
    "api/{controller}/{idArgs}",
    new { action = "show" },
    new { httpMethod = new HttpMethodConstraint("GET"), idArgs = @"^(\d+,)+\d+,?$" }
);

编辑:--我尝试过更多地干扰路由,并注释掉了JsonValueProvider,而且我仍然得到一个空数组。在我的控制器里,我能做到

代码语言:javascript
复制
var ids = RouteData.Values["idArgs"];

得到字符串"1,2,3“。如果框架将它传递给我的ModelBinder,我的ModelBinder将把它转换成IEnumerable

我正在使用AutoFac。是否有可能AutoFac正在向我的控制器方法中注入一个空数组?在其他地方,我没有遇到这样的问题(我们在这个项目中到处使用AutoFac )。

Edit2:我也尝试用[ModelBinder(typeof(IEnumerableOfIntCSVModelBinder))]装饰idArgs动作参数和控制器,但这没有效果。

EN

回答 2

Stack Overflow用户

发布于 2011-04-02 07:23:51

我看到您的Application_Start中添加了一个Application_Start。也许在这个工厂的实现中有什么东西可以防止模型粘合剂被击中呢?

另外,您向/api/v1/widgets/1,2,3显示的url与您拥有"restapi/{controller}/{idArgs}"的路由定义没有任何关系。

票数 1
EN

Stack Overflow用户

发布于 2011-04-16 02:27:19

你能试着把你的路线移到第一条注册吗?我只是尝试编码这一点,并有一个问题,我的路线没有开火,直到我把它的注册高于默认的路由注册。路线似乎是按照他们注册的顺序运行的,所以如果你在注册后有了更具体的注册,并且注册的更一般,它可能不会开火。

在本例中,第二条路由从未被调用:

代码语言:javascript
复制
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”就会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5519548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档