繁体   English   中英

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

[英]Routing and Controller Actions - Optional Data

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

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

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

我更喜欢使用RESTFul url来查询字符串,因为它们很清晰,可以很容易地被用户阅读和seo友好。

在您的情况下,如果您确实希望将URL作为... / 2010/01/01/123456789 / the-name-of-article,则第二种方法更好。

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

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

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

请参阅此问题的网址,它是“ 路由和控制器操作-可选数据” ,此处的问题标题仅用于seo。

如果您希望设计纯属宁静,那么网址应为... / articles / the-art-of-article

我创建这样的URL,因为有很多方法可以优化数据库查询(例如哈希),而且我喜欢纯REST。

在第一个示例的情况下,如果要使用RouteData.Values获取一些值,则传递任何内容有什么意义?

另外,在您连接数据库查询之前,var article = ...是否是一个占位符?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM