ASP.NET MVC,操纵 URL 结构

Posted

技术标签:

【中文标题】ASP.NET MVC,操纵 URL 结构【英文标题】:ASP.NET MVC, Manipulating URL Structure 【发布时间】:2010-10-19 19:51:01 【问题描述】:

如何在 ASP.NET MVC 中创建自定义路由处理程序?

【问题讨论】:

你想达到什么目的?你需要更具体一点 嗨,安德鲁,我已经重新编写了我的问题,希望更具体。为评论喝彩。杰米 【参考方案1】:

ASP.NET MVC 可以轻松地在 Global.asax.cs 中创建自定义路由处理程序:

    routes.MapRoute(
        "Default",
        "controller.aspx/action/id",
        new  action = "Index", id = "" 
      ).RouteHandler = new SubDomainMvcRouteHandler();

这将导致所有请求都由指定的自定义 RouteHandler 处理。对于这个特定的处理程序:

    public class SubDomainMvcRouteHandler : MvcRouteHandler
    
        protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
        
            return new SubDomainMvcHandler(requestContext);
        
    

然后你可以做任何你想做的事情,在这种情况下,SubDomainMvcHandler 从 URL 中获取子域并将其作为属性传递给控制器​​:

    public class SubDomainMvcHandler : MvcHandler
    
        public SubDomainMvcHandler(RequestContext requestContext) : base(requestContext)
        
        

        protected override void ProcessRequest(HttpContextBase httpContext)
        
            // Identify the subdomain and add it to the route data as the account name
            string[] hostNameParts = httpContext.Request.Url.Host.Split('.');

            if (hostNameParts.Length == 3 && hostNameParts[0] != "www")
            
                RequestContext.RouteData.Values.Add("accountName", hostNameParts[0]);
            

            base.ProcessRequest(httpContext);
        
    

【讨论】:

完美。谢谢杰森!出于兴趣,感谢 SO 解决方案的一般方法是什么?评论或其他方式? 我认为在这样一个经过同行评审的社区中,“谢谢”就足够了 ;-) 那么它将作为控制器方法中的一个属性出现? 谢谢 Jason,你能添加一条关于我们如何在 Controller 中获取 accountName 值的注释吗??

以上是关于ASP.NET MVC,操纵 URL 结构的主要内容,如果未能解决你的问题,请参考以下文章

将文件夹添加到 ASP.net MVC 5 站点中的所有 URL

asp.net mvc怎样传递多个url参数

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

ASP.NET MVC 4 异步加载控制器

ASP.Net mvc2 url 格式问题

跟我学ASP.NET MVC之十一:URL路由