从任何 URL 转到默认路线

Go to default route from any URL

当前路线


// Create the front-end route.
Route defaultRoute = routes.MapRoute(
    "CMS_Default",
    "CMS/RenderMvc/{action}/{id}",
    new { controller = "RenderMvc", action = "Index", id = UrlParameter.Optional }
);
defaultRoute.RouteHandler = new RenderRouteHandler(cmsContext, ControllerBuilder.Current.GetControllerFactory());

期望的功能


我希望任何 URL 被取走,例如/home/about-us/contact-us 并转到上面的当前路线:/cms/rendermvc/home/cms/rendermvc/about-us/cms/rendermvc/contact-us URL 段或路由案例中的 {action} 并执行从数据库获取内容的逻辑。我想 不使用 默认 {*url} 路由。

当前想法


所需的功能示例


Umbraco 与我所追求的路由结构相同,只是复杂度更高。

尝试向您的路由表中添加另一条路由。例如:

Route HomeRoute = routes.MapRoute(
    "CMS_Home",
    "CMS/Home",
    new { controller = "RenderMvc", action = "HomeAction"}
);

Route AboutRoute = routes.MapRoute(
    "CMS_About",
    "CMS/About",
    new { controller = "RenderMvc", action = "About"}
);

因此所有这些路由都将寻址到 RenderMvcController 和不同的操作。

我想出来了,因为我的问题表明我需要 IHttpModule。在 的帮助下,我现在已经能够获得我想要的路由!

对于那些好奇的人,这是我的代码。

CMS模块


using System;
using System.IO;
using System.Web;

public class CMSModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += (sender, e) =>
        {
            var httpContext = ((HttpApplication) sender).Context;
            BeginRequest(new HttpContextWrapper(httpContext));
        };
    }

    private void BeginRequest(HttpContextBase httpContext)
    {
        Uri url = httpContext.Request.Url;
        string requestExtension = Path.GetExtension(url.LocalPath);
        if (!string.IsNullOrWhiteSpace(requestExtension)) return;

        httpContext.RewritePath("/cms/rendermvc" + httpContext.Request.Path);
    }

    public void Dispose()
    { }
}

Web.config


<configuration>
  <system.webServer>
    <modules>
      <add name="CMSModule" type="CMS.Web.CMSModule,CMS.Web"/>
    </modules>
  </system.webServer>
</configuration>

警告


这是非常基本的代码,我不建议复制它,因为我确信有很多我没有考虑的边缘情况,但目前它可以工作。