代码之家  ›  专栏  ›  技术社区  ›  Dismissile

路由和控制器操作-可选数据

  •  0
  • Dismissile  · 技术社区  · 14 年前

    我在ASP.net MVC应用程序中创建了一个路由,如下所示:

    routes.MapRoute(
        "ArticleRoute",
        "{year}/{month}/{day}/{articleId}/{displayName}",
        new { controller = "Article", action = "Details" }
    );
    

    我想要一条像博客文章一样的路线。

    例子: http://www.foobar.com/2010/01/01/123456789/the-name-of-the-article

    在我的详细信息控制器操作中,如果年份、月份、日期和显示名称不正确,我希望执行永久重定向。我想知道编写Details()控制器方法的最佳方法。

    唯一真正需要的字段是articleId。如果我有文章Id,那么数据库将有文章的日期和名称。

    我真的想知道控制器方法应该是什么样子。我是将所有值传递给方法还是使用RouteData来获取它们?

    public ActionResult Details(int articleId, string displayName)
    {
        var article = */SNIP*/;
    
        int articleYear = RouteData.Values["year"];
        // etc.
        DateTime articleDate = new DateTime(articleYear, articleMonth, articleDay);
    
        string realDisplayName = article.Name.ToSeoString();
    
        if( displayName != realDisplayName || article.Date != articleDate)
            // permanent redirect to the actual article
    
        return View();
    }
    

    或者

    public ActionResult(int year, int month, int day, int articleId, string displayName)
    {
        var article = /*SNIP*/;
    
        DateTime articleDate = new DateTime(year, month, day);
    
        string realDisplayName = article.Name.ToSeoString();
    
        if( displayName != realDisplayName || article.Date != articleDate )
            // permanent redirect to the actual article
    
        return View();
    }
    

    我认为这两种方法在技术上都有效,但哪种方法更好?

    另外:如果我所做的还有任何其他的缺点,请随时指出。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Community kfsone    7 年前

    我更喜欢RESTFul url而不是查询字符串,因为它们是清晰的,用户可以很容易地阅读和搜索引擎优化友好的。

    在您的例子中,如果您真的希望url为…/2010/01/01/123456789/文章的名称,那么第二种方法更好。

    但是我认为如果您使用url中的文章id,就不需要使用data/month。

    像wordpress这样的应用程序使用/year/month/title格式,因为如果只给出文章的标题,查询数据库需要更多的时间。但是使用年和月可以加快数据库查询,因为可以缩小结果范围,然后对该结果集进行标题搜索。

    我认为你应该用这样的方式……/123456789/文章的名称

    看这个问题的网址 Routing and Controller Actions - Optional Data 这里的问题标题只用于搜索引擎优化的目的。

    如果您希望设计是纯restful的,那么url应该是…/articles/文章的名称

    我创建这样的url,因为有很多方法可以优化db查询(比如散列),我喜欢纯REST。

        2
  •  0
  •   M3NTA7    14 年前

    在第一个例子中,如果要使用RouteData.Values来获取一些值,那么传入任何内容有什么意义?

    另外,var文章是不是。。。一个占位符直到你连接数据库查找?

    从客户端来说,这无关紧要,因为URL不会有任何不同。

    在服务器端,第二个示例在代码中看起来更清晰,因为您没有RouteData.Values的查找。

        3
  •  0
  •   gerry    14 年前

    查询字符串比REST url好得多。路由是从早期的HTTP开始的,但是对于许多web站点,由于参数依赖于路由构造,所以被传递给查询字符串。此外,路由不适合在需要时加密参数。

        4
  •  0
  •   Mitch Humeniuk    14 年前

    传入所有内容更好,因为您的参数是强类型的,而RouteData.Values集合不是。您还可以强制转换RouteData.Values项,但这是您不必执行的额外代码。这是ASP.NET MVC为您编写代码的另一个例子,因此如果您想做一些不同的事情,您就没有多少控制权。Web表单对于框架实际所做的工作更加透明,而MVC则是无稽之谈。