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

时间:2010-11-15 20:48:22

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

我在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 个答案:

答案 0 :(得分:1)

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

在你的情况下,如果你真的想要网址为... / 2010/01/01 / 123456789 /文章名称,第二种方法是更好的方法。

但是如果您在网址中使用文章ID,我认为没有必要使用数据/月。

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

我认为你应该使用像... / 123456789 / the-name-of-article

这样的路线

在此处查看此问题的网址Routing and Controller Actions - Optional Data,问题标题仅用于搜索引擎优化目的。

如果你想要设计纯粹的宁静,那么网址应该是...... / articles / the-name-of-the-article

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

答案 1 :(得分:0)

在第一个例子的情况下,如果要使用RouteData.Values获取某些值,那么传递任何内容的重点是什么?

另外,var article = ...是一个占位符,直到你挂钩数据库查找?

从客户端来看,这没关系,因为URL不会有任何不同。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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