【问题标题】:How do I redirect everything to a single controller?如何将所有内容重定向到单个控制器?
【发布时间】:2011-09-23 04:40:17
【问题描述】:

我有三个具体的路线:

    routes.MapRoute(
       "Home Page",
       "", 
       new { controller = "Home", action = "Index" } 
       );

    routes.MapRoute(
       "Admin Section",
       "AdminSection/{action}/{id}",
       new { controller = "AdminSection", action = "Index", id = UrlParameter.Optional }
       );

    routes.MapRoute(
       "Listings",
       "{controller}/{action}/{id}",
       new { controller = "Listings", action = "Index", id = UrlParameter.Optional }
       );

基本上,前两个路由按计划工作,但是,我希望将不在路由中的所有内容重定向到 listings 控制器。

我对路由还是很陌生,过去一个小时一直在尝试用 Google 搜索它,但没有任何运气 - 我确切地知道这里发生了什么,但是,我不知道如何解决它。

我使用过 RouteDebugger,我可以看到它正在访问路由,但问题是如果未指定控制器,它只会转到 Listings 控制器 - 但是,显然总会有一些东西在那里。

我尝试了几种不同的组合 - 我认为我通过删除 URL 的 {controller} 部分并仍然定义默认值来赢得胜利,但是,我运气不佳。

有人知道我需要做什么吗?

【问题讨论】:

    标签: asp.net-mvc-3 asp.net-mvc-routing maproute


    【解决方案1】:

    这个怎么样:

    routes.MapRoute("Listings", "{action}/{id}", 
            new { controller = "Listings", action = "Index", id = UrlParameter.Optional });
    

    site.com/test:

    它将转到action: testcontroller: listingid = blank

    【讨论】:

    • 再一次,我觉得自己像个白痴 - 这正是我想要做的,但是,我在 new {...} 部分犯了一个错误,直到我复制了你的例子我才看到进去。非常感谢。
    【解决方案2】:

    编辑:据我了解,您需要一条包罗万象的路线。

    http://richarddingwall.name/2008/08/09/three-common-aspnet-mvc-url-routing-issues/

    routes.MapRoute("Listings", "{*url}",
        new { controller = "Listings", action = "Index" }
    );
    

    原文:

    我目前无法测试,但是

    routes.MapRoute(
       "Listings",
       "{anythingOtherThanController}/{action}/{id}",
       new { controller = "Listings", action = "Index", id = UrlParameter.Optional }
       );
    

    这应该可行。

    在您的列表控制器中,只需接受一个字符串参数“anythingOtherThanController”,它就会绑定到它。

    这里的主要问题是 /some/action 将被映射到与 /another/action 相同的操作。所以我不确定你想在这里做什么:)

    【讨论】:

    • +1 为您提供所有帮助,当我有更多时间时,我会阅读那个(有趣的)链接......但是,我在尝试时接受了一个答案,它正是我想要的.
    • 没有问题。只要能解决你的问题。抱歉,我无法理解您的要求 :) 请进行测试,以防万一。
    【解决方案3】:

    提供默认路由并提供控制器名称作为列表控制器。将此路由映射保留在所有映射的底部。

     routes.MapRoute(
       "Default",
       "{controller}/{action}/{id}",
       new { controller = "Listings", action = "Index", id = UrlParameter.Optional }
       );
    

    对不起,我把序列弄混了。

    【讨论】:

    • 这不起作用 - 我已经尝试过了...如果我想要一个“site.com/bla”的 url - 这将尝试使用 index 的默认操作加载 bla 控制器... . 我需要它在列表的默认控制器上加载 bla 操作。 (当我说尝试时,我的意思是降低优先级......如果它是第一个,它会破坏其他路线)。
    • 这将捕获所有内容,包括 AdminSection,不是吗?
    • 我怀疑如果你这样做了,并且有人输入了 adminsection/whatever,它不会进入 adminsection 路由,而是这个默认路由会尝试执行它。
    • 哦,我对位置(顶部/底部)感到困惑。我之前在我的一个项目中使用过它。我已经更新了答案。
    猜你喜欢
    • 2015-05-02
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多