我们如何构造URL路由?
开发人员通常遵循特定的模式吗?在Web应用程序中,我从未真正考虑过它,但是ASP.NET MVC路由引擎几乎迫使我们至少要考虑它。
到目前为止,我很喜欢控制器/操作/索引结构(例如Products / Edit / 1),但是我正努力处理更复杂的网址。
例如,假设我们有一个页面,列出了用户帐户中拥有的所有产品。你会怎么做?我不由自主地想到了列表页面和编辑页面的以下可能性:
- 用户/ {用户ID} /产品/列表,用户/ {用户ID} /产品/编辑/ {产品ID}
- 用户/ {用户ID} /产品,用户/ {用户ID} /产品/ {产品ID}
- 产品?UserID = {用户ID},产品/编辑/ {产品ID}
我敢肯定,还有很多我想念的人。有什么建议吗?
解决方案
我们可能要看一下"友好的URL方案?"这个问题。
特别是,Larry.Smithmier的答案提供了在ASP.NET中使用MVC时常见的URL方案的列表。
此外,我们可能会考虑使用不同的动词来将相同的路线用于不同的动作。例如,对" Products / Edit / 45"的GET请求将显示产品编辑器,而对相同URL的POST将更新产品。我们可以使用AcceptVerb属性来完成此操作:
[AcceptVerb("GET")] public ActionResult Edit(int id) { ViewData["Product"] = _products.Get(id); return View(); } [AcceptVerb("POST")] public ActionResult Edit(int id, string title, string description) { _products.Update(id, title, description); TempData["Message"] = "Changes saved successfully!"; return RedirectToAction("Edit", new { id }); }
Bill de hra写了一篇很好的文章,标题为框架的Web资源映射标准,非常值得一读。
我喜欢RESTful,用户友好和可入侵的URL。
这是什么意思?让我们从用户友好的URL开始。对我来说,用户友好的URL易于键入且易于记住,/ Default.aspx?action = show&userID = 140不满足任何这些要求。像`/ users / troethom这样的URL似乎很合逻辑。
这引出了下一点。可入侵的URL是用户可以修改并仍然显示结果的URL。如果该URL是可破解的,并且我的个人资料的URL是/ users / troethom
,则可以安全地删除我的用户名以获取用户列表(/ users)。
使用RESTful URL与其他建议背后的想法非常相似。我们是为用户而不是机器设计URL,因此URL必须与内容有关,而不是站点的技术后端。作为/ users的URL比/ users / list更有意义,而作为/ category / programming / javascript的URL更有意义(在" programming"类别中表示子类别" javascript"比/ category / show / 12好。
确实,省略ID确实比较困难,但是在我的世界中,值得付出努力。
另请参阅有关W3C常见HTTP实现问题的"理解URI"部分。在设计URI时,它列出了常见的陷阱。另一个很好的资源是"资源与可入侵的搜索URL"。
要添加到troethom的注释中,RESTful通常还意味着,例如,要创建一个新用户,我们需要将一个表示形式放置到/ users / newusername
RESTful基本上使用5种标准HTTP方法(GET,PUT,POST,DELETE和HEAD)来控制/访问内容。
好的,这对于网络浏览器而言并不容易,但是我们始终可以使用重载的POST(张贴到/ users / username并带有用户表示形式来更改某些详细信息,等等。
它是一种很好的处理方式,我建议阅读RESTFul Web服务以获得更好的理解:D(这是一本令人毛骨悚然的好书!)
我已经看到两种主要的接受该主题的方法...
MvcContrib项目文档中对此进行了描述
另一则在Stephen Walther的博客文章中进行了介绍(我个人更喜欢)。