8

是否有开发人员通常遵循的特定模式?我以前在我的 Web 应用程序中从未真正考虑过它,但是 ASP.NET MVC 路由引擎几乎迫使您至少考虑到它。

到目前为止,我喜欢控制器/动作/索引结构(例如 Products/Edit/1),但我正在努力处理更复杂的 url。

例如,假设您有一个页面,其中列出了用户在其帐户中拥有的所有产品。你会怎么做?在我的脑海中,我可以想到列表页面和编辑页面的以下可能性:

  1. 用户/{用户 ID}/产品/列表,用户/{用户 ID}/产品/编辑/{产品 ID}
  2. 用户/{用户 id}/产品,用户/{用户 id}/产品/{产品 id}
  3. Products?UserID={user id}, Products/Edit/{product id}

我敢肯定还有很多其他我想念的。有什么建议吗?

4

6 回答 6

8

我喜欢 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 时的常见陷阱。另一个很好的资源是Resourceful Vs Hackable Search URLs

于 2008-09-23T21:14:19.313 回答
3

您可能想看看“友好的 url 方案? ”这个问题。

特别是,Larry.Smithmier 的回答提供了在 ASP.NET 中使用 MVC 时的常见 URL 方案列表。

于 2008-09-23T07:04:10.837 回答
1

此外,您可以考虑使用不同的动词来为不同的操作重用相同的路线。例如,对“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 });
}
于 2008-09-23T07:21:38.987 回答
0

Bill de hÓra 写了一篇非常好的文章,题为“框架的 Web 资源映射标准”,非常值得一读。

于 2008-09-23T08:10:20.960 回答
0

要添加到 troethom 的评论中,RESTful 通常还意味着,例如,要创建一个新用户,您可以将一个表示放入 /users/newusername

RESTful 基本上使用 5 种标准 HTTP 方法(GET、PUT、POST、DELETE、HEAD)来控制/访问内容。

好的,这对于网络浏览器来说并不容易,但是您始终可以使用重载的 POST(发布到 /users/username 并代表用户更改一些细节等)。

这是一种很好的做事方式,我建议阅读RESTFul Web 服务以获得更好的理解:D(这是一本非常好的书!)

于 2008-09-24T07:38:13.697 回答
0

我已经看到了两种主要接受的方法来处理这个话题......

一种在MvcContrib 项目文档中描述

and the other one is described in a blog post by Stephen Walther (which I personally prefer).

于 2008-09-26T18:01:52.843 回答