【问题标题】:Routing and Controller Actions - Optional Data路由和控制器操作 - 可选数据
【发布时间】:2010-11-15 20:48:22
【问题描述】:

我在 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();
}

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

另外:如果我在做的事情中有任何其他缺陷,请随时指出。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    我更喜欢 RESTFul url 来查询字符串,因为它们很清晰,用户可以轻松阅读并且对 seo 友好。

    在您的情况下,如果您真的希望网址为 .../2010/01/01/123456789/the-name-of-the-article,则第二种方法更好。

    但我认为如果您在 url 中使用文章 id,则无需使用数据/月。

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

    我认为您应该使用 .../123456789/the-name-of-the-article 之类的路线

    查看这个问题的 url,它是Routing and Controller Actions - Optional Data,这里的问题标题仅用于 seo 目的。

    如果您希望设计纯粹宁静,那么 url 应该是 .../articles/the-name-of-the-article

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

    【讨论】:

      【解决方案2】:

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

      另外,在您连接数据库查找之前,var article = ... 现在是占位符吗?

      从客户端来说,这并不重要,因为 URL 不会有任何不同。

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

      【讨论】:

      • 这基本上就是我要问的。使用 RouteData.Values 只检索一些值是否有意义,或者我应该只传递所有内容。
      【解决方案3】:

      查询字符串比 REST URL 好得多。路由来自 HTTP 的早期阶段,但由于参数取决于路由构造,因此被许多网站的查询字符串传递。此外,路由不适合在需要时加密参数。

      【讨论】:

        【解决方案4】:

        传递所有内容会更好,因为您的参数是强类型的,而 RouteData.Values 集合不是。您还可以转换 RouteData.Values 项目,但这是您不必执行的额外代码。这是 ASP.NET MVC 为您编写代码的另一个示例,因此如果您想做不同的事情,您的控制权就会减少。 Web 表单对于框架实际在做什么更加透明,而 MVC 是烟雾和镜子。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2012-08-08
          • 2020-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多