2010-10-09 58 views
1

我在独特的ASP.Net MVC项目中获得了独特的需求。基本上,我们正在将一个较旧的基于Linux的网站迁移到MVC,我们希望保留最后一个网站上的网址。如何根据查询表检查基于url的ASP.Net MVC?

为网站的子目录(例如www.mywebsite.com/pickes/cherry-pickle-recipe.html)创建一个新的控制器是不实际的。

所以我想这样做的以下

  1. 一个创建的URL的查找列表。应该根据数据库检查URL,如果发现URL,则应该从某个控制器返回某个操作。

  2. 捕获所有没有控制器的url请求,并将它们发送给某个controller-> action。

我应该怎么办?

回答

5

嗯,我想你可以通过编写自定义routehandler做到这一点通过实施IRouteHandlerInterface

public class LookupRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     IRouteHandler handler = new MvcRouteHandler(); 
     var vals = requestContext.RouteData.Values; 
     if(String.IsNullOrEmpty(vals["controller"]) 
     { 
      // fetch action and controller from database 
      vals["controller"] = dbcontroller; 
      vals["action"] = dbaction; 
     } 
     return handler.GetHttpHandler(requestContext); 
    } 
} 

你要做的一件事就是注册在Global.asax中的路由处理像

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

其值得说 - 在应用程序启动时的global.asax.cs中,一次为查找表命中数据库,并将结果缓存到某处,以便您可以在此处使用它。 – Nik 2010-10-09 18:13:23

+0

是的,这将节省数据库命中每个请求+1 – 2010-10-09 19:41:44