mvc.net动态网址

时间:2010-01-27 21:15:52

标签: c# asp.net-mvc seo

我希望制作一个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之外,这是否存在问题以及我对此有何看法?

2 个答案:

答案 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等) - 看看这些你的数据库。