【问题标题】:How do I configure ASP.NET MVC routing to hide the controller name on a "home" page?如何配置 ASP.NET MVC 路由以在“主页”页面上隐藏控制器名称?
【发布时间】:2010-09-02 14:16:18
【问题描述】:

从这个问题开始:

ASP.NET MVC Routing with Default Controller

我有一个类似的要求,我的最终用户不希望在他们的应用程序的登陆或“主页”的 URL 中看到控制器名称。

我有一个名为DeviceController 的控制器,我希望它成为“主页”控制器。这个控制器有很多动作,我想使用如下 URL:

http://example.com -> 调用 Index() http://example.com/showdevice/1234 -> 调用 ShowDevice(int id) http://example.com/showhistory/1224 -> 调用 ShowHistory(int id)

我还需要为此控制器生成链接,以省略 url 的 /device 部分。

我还有一些其他的控制器,例如BuildController

http://example.com/build http://example.com/build/status/1234 http://example.com/build/restart/1234

等等。这些控制器的 URL 没有问题。

问题是,即使在研究了上面提到的问题的答案之后,我似乎也无法理解路由。

谁能提供一个代码示例来解释如何做到这一点?

我正在使用 ASP.NET MVC2。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 routing asp.net-mvc-routing


    【解决方案1】:

    试试这个:

       private void RegisterRoutes(RouteCollection routes) {
    
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
          routes.MapRoute("default", "{controller}/{action}/{id}",
             new { action = "index", id = "" },
             // Register below the name of all the other controllers
             new { controller = @"^(account|support)$" });
    
          routes.MapRoute("home", "{action}",
             new { controller = "device", action = "index" });
       }
    

    例如/foo

    如果foo 不是控制器,则将其视为device 控制器的操作。

    【讨论】:

    • 有什么方法可以做到这一点,而不必手动列出正则表达式中的所有其他控制器?
    【解决方案2】:

    第 1 步: 创建路由约束。

    public class RootRouteConstraint<T> : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
            return rootMethodNames.Contains(values["action"].ToString().ToLower());
        }
    }
    

    第 2 步:
    在使用我们刚刚创建的路由约束的默认映射之上添加一个新的路由映射。通用参数应该是您计划用作“根”控制器的控制器类。

    routes.MapRoute(
                    "Root",
                    "{action}",
                    new {controller = "Home", action = "Index", id = UrlParameter.Optional},
                    new {isMethodInHomeController = new RootRouteConstraint<HomeController>()}
                    );
    
    
    routes.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new
                    {controller = "Home", action = "Index", id = UrlParameter.Optional}
                    );
    

    现在您应该可以像这样访问您的家庭控制器方法: example.com/about, example.com/contact

    这只会影响 HomeController 的 url。所有其他控制器将具有默认路由功能。

    【讨论】:

    • 嗨,如何在不影响任何其他控制器的情况下将 domain.com/Home/About 重定向到 domain.com/About。
    • 如上所述,将上述代码添加到您的项目中。它将满足您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多