[英]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.