你如何构建URL路由结构?

8
有没有一种特定的模式开发人员通常会遵循?我以前在我的Web应用程序中从来没有太考虑过这个问题,但是ASP.NET MVC路由引擎基本上迫使你至少要考虑一下这个问题。
到目前为止,我喜欢控制器/操作/索引结构(例如Products/Edit/1),但我在处理更复杂的URL时遇到了一些困难。
例如,假设您有一个页面列出用户帐户中所有产品的页面,您将如何实现?我能想到以下可能性来实现列表页面和编辑页面:
1. User/{user id}/Products/List、User/{user id}/Products/Edit/{product id}
2. User/{user id}/Products、User/{user id}/Products/{product id}
3. Products?UserID={user id}、Products/Edit/{product id}
我相信还有其他很多方法我没有列举到。请问有什么建议吗?
6个回答

8
我喜欢RESTful,用户友好和可hack的URL。
这意味着什么?让我们从“用户友好的URL”开始。对我而言,用户友好的URL是易于输入和记忆的东西,如`/Default.aspx?action=show&userID=140`不满足任何这些要求。像`/users/troethom`这样的URL似乎更符合逻辑。
这就引出了下一个问题。“可hack的URL”是指用户可以修改并仍然得到结果的URL。如果URL是可hack的,并且我的个人资料的URL为`/users/troethom`,那么安全地删除我的用户名就可以获得用户列表(`/users`)。
使用“RESTful URL”与我的其他建议类似。你正在为用户设计URL,而不是为机器设计URL,因此URL必须与内容相关,而不是与站点的技术后端相关。`/users`这样的URL比`/users/list`更有意义,`/category/programming/javascript`(表示类别“编程”中的子类别“javascript”)的URL比`/category/show/12`更好。

虽然省略ID更困难,但在我的世界里这是值得努力的。

另请参考W3C的“常见HTTP实现问题”中的理解URI部分。它列出了设计URI时常见的陷阱。另一个很好的资源是富有资源性与可破解的搜索URL


3

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 });
}

0

0

补充troethom的评论,RESTful通常也意味着例如创建新用户时,您将向/users/newusername PUT一个表示。

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

好吧,这对于Web浏览器来说并不容易,但您始终可以使用过载的POST(将用户的表示形式发布到/ users / username以更改某些详细信息等)。

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


0

这些链接已经失效了,这里有一个存档链接:http://stephenwalther.com/archive/2008/06/27/asp-net-mvc-tip-11-use-standard-controller-action-names - remjx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接