从任何 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}
路由。
当前想法
我不是很熟悉,但是ActionFilters
可以用在这种情况下吗?
- 我相信这可以通过默认模块实现?
所需的功能示例
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>
警告
这是非常基本的代码,我不建议复制它,因为我确信有很多我没有考虑的边缘情况,但目前它可以工作。
当前路线
// 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}
路由。
当前想法
我不是很熟悉,但是ActionFilters
可以用在这种情况下吗?- 我相信这可以通过默认模块实现?
所需的功能示例
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>
警告
这是非常基本的代码,我不建议复制它,因为我确信有很多我没有考虑的边缘情况,但目前它可以工作。