我在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();
}
我认为技术上都有效,但哪种方式更好?
另外:如果我正在做的任何其他缺陷,请随时指出它们。
答案 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则是冒烟和镜像。