我正在尝试根据存储在 mvc 数据库中的 url 添加一些自定义路由逻辑。(CMS Like),我认为它相当基本,但我觉得我并没有真正到达任何地方。
基本上,用户可以键入 url,例如:
www.somesite.com/categorya/categoryb/categoryf/someitem
www.somesite.com/about/someinfo
在数据库中存储这些项目以及它们的类型,即普通页面或产品页面。
根据这一点,然后我想实际使用不同的“动作”方法,即我希望上面的方法可以使用:
PageController/Product
PageController/Normal
然后,这些操作会加载此页面的内容并显示相同的视图(产品视图或普通视图)。
使用正常的路由方式是行不通的,因为我可能有类似的东西;
cata/producta
cata/catb/catc/catd/cate/catf/producta
现在我一直在看这里:ASP.NET MVC custom routing for search
并试图以此为基础,但我如何真正“改变”我想在 InvokeActionMethod 调用中点击的操作方法?
顺便说一句,使用 MVC 3.0。
感谢您的任何帮助/建议
最终解决方案:
全球.asax
routes.MapRoute(
"Default",
"{*path}",
new { controller = "Page", action = "NotFound", path= "Home" }
).RouteHandler = new ApplicationRouteHandler();
路由处理程序
public class ApplicationRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new ApplicationHandler(requestContext);
}
}
public class ApplicationHandler : MvcHandler, IRequiresSessionState
{
public ApplicationHandler(RequestContext requestContext)
: base(requestContext)
{
}
protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
{
var url = RequestContext.RouteData.Values["path"].ToString();
var page = SomePageService.GetPageByUrl(url);
if (page == null)
{
RequestContext.RouteData.Values["Action"] = "NotFound";
}
else
{
RequestContext.RouteData.Values["Action"] = page.Action;
RequestContext.RouteData.Values["page"] = page;
}
return base.BeginProcessRequest(httpContext, callback, state);
}
}