我想构建一个ASP.NET MVC站点,以便特定URL的控制器存储在数据库中而不是URL中。
原因是我正在构建CMS系统,用户应该能够在不更改URL的情况下更改模板(控制器)。我还认为控制器的名称与最终用户无关,我想要干净的URL:s。
我意识到我可以在应用程序启动时添加所有路由,但是对于具有类似10万页的系统,这感觉是个坏主意。
是否可以将url:s存储在数据库中并查找每个请求,然后将该请求映射到特定的控制器?
答案 0 :(得分:4)
基本上你必须实现自己的IRouteHandler。
部分答案和一些示例代码在本问题答案的选项3中: ASP.NET MVC custom routing for search
答案 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),而不是创建一个繁重的路由系统,它允许用户只添加有效的内部链接。在模板及其控制器的数据库中保留一个表,用它来填充控件。