【问题标题】:One controller for whole ASP.NET MVC application一个控制器用于整个 ASP.NET MVC 应用程序
【发布时间】:2010-11-09 19:53:39
【问题描述】:

我想为所有网站 url 设置一个控制器 例如:

  • www.mysite.com/page1
  • www.mysite.com/another
  • www.mysite.com/third/some-text
  • www.mysite.com/fourth/some/some/some/some

url 将手动创建,url 也可以是“所有类型”(理论上你必须有可能将所有内容都放在 url 中) 我不想将控制器名称或任何东西(操作名称或 ID)放在 url 中。

如何为此编写 url 路由规则?我对这种设计的缺点不感兴趣。 这是默认的 ASP.NET MVC 路由规则

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }  // Parameter defaults
);

【问题讨论】:

  • 我很感兴趣 - 为什么你只想拥有一个控制器?

标签: c# asp.net-mvc


【解决方案1】:

我不会告诉你这是一个糟糕的计划。但它是。无论如何,如果您不需要处理无限的 url 文件夹深度,诀窍就是以相反的顺序运行:

       //maps virtual redirects
        routes.MapRoute("virtual redirects",
                        "{redirect}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "VirtualRedirect"
                        }
            );

        routes.MapRoute("two level",
                        "{firstPart}/{secondPart}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "PageUrl",
                            thirdPart = ""
                        }
                        );

        //maps general content pages
        routes.MapRoute("page catcher",
                        "{firstPart}/{secondPart}/{thirdPart}",
                        new
                        {
                            area = "",
                            controller = "Content",
                            action = "PageUrl"
                        }
            );

请注意,您需要在此之上放置任何更具体的路由,并且您仍然需要在此之后声明一个默认路由,以便 MVC 的某些部分正常工作。

【讨论】:

    【解决方案2】:

    我认为你可以这样做,只需覆盖 routHandler

            routes.MapRoute(
                "dbroute",
                "{controller}/{action}/{id}",
                new { id = "" }
                ).RouteHandler = new MyRouteHandler();
    

    还有你这样的新路由处理程序

    public class MyRouteHandler : IRouteHandler 
    {
    
        #region IRouteHandler Members
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            IRouteHandler handler = new MvcRouteHandler();
            var vals = requestContext.RouteData.Values;
            if (vals["controller"] != null && 
            (vals["controller"].ToString() == "page1" ||
            vals["controller"].ToString() == "another" ||
            vals["controller"].ToString() == "others" ) )
            {
    
                vals["controller"] = "Test";// your controller; 
                vals["action"] = "Index";//your action 
            }
            return handler.GetHttpHandler(requestContext);
        }
    
    
        #endregion
    }
    

    【讨论】:

      【解决方案3】:

      伊戈尔,

      除非有真正令人信服的理由这样做,否则我会考虑替代方法来呈现您想要的 URL,并考虑每个逻辑单元正在执行的“幕后”的谨慎功能。不久前有人问了一个类似的问题,我回答了:

      What is the advantage of using multiple Controller classes in ASP.NET MVC?

      可能会给你一些想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 2011-04-14
        • 2019-04-18
        • 1970-01-01
        • 2013-03-08
        • 2016-10-04
        相关资源
        最近更新 更多