我希望制作一个MVC网站,它可以使用路由完全控制网址结构。
routes.MapRoute(
"BlogView", // Route name
"view/{blogurl}", // URL with parameters
new { controller = "view", action = "view", productLink = ""} // Parameter defaults
);
routes.MapRoute(
"ProductGrid", // Route name
"category/{category}", // URL with parameters
new { controller = "category", action = "Index", category = "" } // Parameter defaults
);
routes.MapRoute(
"BlogView", // Route name
"view/{blogurl}", // URL with parameters
new { controller = "view", action = "view", productLink = ""} // Parameter defaults
);
routes.MapRoute(
"ProductGrid", // Route name
"category/{category}", // URL with parameters
new { controller = "category", action = "Index", category = "" } // Parameter defaults
);
我目前有以下网址;
www.myblog.com/view/first-post
www.myblog.com/view/another-post
www.myblog.com/category/code
www.myblog.com/category/example
前两个网址与详细视图相关,后两个网址与类别视图相关。
我有一个具有以下结构的数据库;我确保url(chrUrl)是一个唯一键。 url(idurl(int), chrURL, chrAction, chrController )
我的计划是可以查找重写路由查找表,以便以下网址重定向到网站中的正确视图和页面;
www.myblog.com/first-post
www.myblog.com/another-post
www.myblog.com/code
www.myblog.com/example
这可能吗?除了Perofmance之外,这是否存在问题以及我对此有何看法?
答案 0 :(得分:1)
由于您没有任何区分视图和类别项的内容,我会考虑使用默认控制器来检查id是否在categories表中,并将控制传递给View或Category控制器。 / p>
routes.MapRoute(
"Root", // Route name
"/{id}", // URL with parameters
new { controller = "default", action = "redirect"} // Parameter defaults
);
但如果您可以在类别网址中使用“/ category /”,那么这将是后端更优雅的解决方案。
答案 1 :(得分:1)
首先,我建议您提出一个您满意的网址方案。 (似乎你已经有了)
然后我将使用一个ControllerFactory来负责实例化和 在右侧控制器上运行正确的操作。这与您在路由表中定义的任何路由无关 - 事实上,由于您希望将URL设置为“数据库驱动”,因此无论您拥有什么路由都不重要。您可以从Global.asax文件中调用控制器工厂:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new Controllers.ControllerFactory());
}
然后在ControllerFactory的GetControllerType方法中,使用
检查URL RequestContext.RouteData.Values.ContainsKey("keyname")
计算用户呈现的url方案,并根据该方案进行数据库查找。
如果你想更进一步,你的数据库也可以包含对控制器进行实例化的引用,但这对你的情况来说太过分了。作为一个快速说明,我们在一个解决方案中使用它,重要的是为非开发人员提供创建模板的能力,而不涉及开发 - 数据库持有的url方案,控制器和视图在该控制器上呈现。
当你在这里时,如果你想让事情变得更优雅,那么创建一个你的控制器继承的BaseController,并在你的ViewData中设置东西,比如你的SEO标签(MetaDescription,Title等) - 看看这些你的数据库。