使用数据库查找进行网址路由?

时间:2009-05-26 20:02:44

标签: asp.net-mvc routing

我想构建一个ASP.NET MVC站点,以便特定URL的控制器存储在数据库中而不是URL中。

原因是我正在构建CMS系统,用户应该能够在不更改URL的情况下更改模板(控制器)。我还认为控制器的名称与最终用户无关,我想要干净的URL:s。

我意识到我可以在应用程序启动时添加所有路由,但是对于具有类似10万页的系统,这感觉是个坏主意。

是否可以将url:s存储在数据库中并查找每个请求,然后将该请求映射到特定的控制器?

4 个答案:

答案 0 :(得分:4)

基本上你必须实现自己的IRouteHandler。

部分答案和一些示例代码在本问题答案的选项3中: ASP.NET MVC custom routing for search

更多信息: http://weblogs.asp.net/fredriknormen/archive/2007/11/18/asp-net-mvc-framework-create-your-own-iroutehandler.aspx

答案 1 :(得分:1)

为什么你不能做这样的事情:

- Global.asax.cs -

 routes.MapRoute(null,              // Route name
                 "content/{id}",    // URL with parameters               
                 new { Controller = "Content", Action = "Show", Id = (string) null });  // Parameter defaults

- /Controllers/ContentController.cs -

public class ContentController : Controller
{
    public ActionResult Show(string id)
    {
        // Lookup the 'content' (article, page, blog post, etc) in the repository (database, xml file, etc)
        ContentRepository repository = new ContentRepository();
        Content content = repository.FindContent(id);
        return View(content);
    }
}

对您的网站www.yoursite.com/content/welcome-to-my-first-blog-post的请求会调用ContentController.Show(“welcome-to-my-first-blog-post”)。

答案 2 :(得分:-1)

我认为ASP.NET可以做许多与PHP相同的事情。如果是这样,有一个简单的方法。

使用重写规则,您可以轻松地将任何流量发送到100K的任何URL到同一个地方。在该目标上,您可以简单地使用包含客户端请求的URL的服务器变量并提取位置。在数据库中查找并将该URL的相应​​数据即时发送回客户端。

答案 3 :(得分:-1)

“对于拥有100,000页面的系统来说,感觉这是一个坏主意。”

如果要创建无法重复使用的路由系统,这是一个坏主意。基本的{controller} / {action} / {id}架构指向您重用的方向。可以根据您的需要扩展/修改/重新创建此架构。

而不是考虑有多少页面可以考虑如何对资源进行分组。

为什么不创建一个锚链接控件(ascx),而不是创建一个繁重的路由系统,它允许用户只添加有效的内部链接。在模板及其控制器的数据库中保留一个表,用它来填充控件。