【问题标题】:mvc.net dynamic urlsmvc.net 动态网址
【发布时间】:2011-01-10 03:41:52
【问题描述】:

我希望创建一个 MVC 站点,该站点可以使用路由完全控制 url 结构。

        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 与详细视图相关,后两个与类别视图相关。

我有一个具有以下结构的数据库;我确保 url (chrUrl) 是唯一键。 url ( idurl (int), chrURL, chr动作, chrController )

我的计划是可以查找重写路由查找表,以便以下 url 重定向到站点中的正确视图和页面;

www.myblog.com/first-post

www.myblog.com/another-post

www.myblog.com/code

www.myblog.com/example

这可能吗?抛开性能不谈,这有什么问题吗?我应该怎么做?

【问题讨论】:

    标签: c# asp.net-mvc seo


    【解决方案1】:

    首先,我建议您提出一个您满意的 URL 方案。 (好像你已经有了)

    然后我会使用一个 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 等)——看看这些从您的数据库中提取。

    【讨论】:

    • 这对于两张桌子来说可能有点过头了,但是当你不知道你最终会得到什么以及有多少张桌子时,这听起来是一个合理的前进方式。不过,无论您采用哪种方式,我仍然会担心失去 url 的 hackability 部分以及只有一条路径所带来的唯一性问题。
    【解决方案2】:

    由于您没有任何东西可以区分视图和类别项目,我会考虑使用默认控制器来检查 id 是否在类别表中并将控制权传递给视图或类别控制器。

    routes.MapRoute(
                "Root",  // Route name
                "/{id}",    // URL with parameters
                new { controller = "default", action = "redirect"}  // Parameter defaults
            );
    

    但是,如果您可以在类别网址中使用“/category/”,那将是后端更优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 2021-04-27
      • 2013-08-17
      • 2012-03-15
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多