你如何构建你的URL路由?

时间:2008-09-23 06:57:05

标签: asp.net-mvc url routing

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

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

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

  1. 用户/ {用户ID} /产品/列表,用户/ {用户ID} /产品/编辑/ {产品ID}
  2. 用户/ {用户ID} /产品,用户/ {用户ID} /产品/ {产品ID}
  3. 产品?UserID = {用户ID},产品/编辑/ {产品ID}
  4. 我确信还有很多其他人我都错过了。有什么建议吗?

6 个答案:

答案 0 :(得分:7)

我喜欢RESTful,用户友好且可浏览的网址。

这是什么意思?让我们从用户友好的URL 开始。对我而言,用户友好的URL易于输入且易于记忆/Default.aspx?action=show&userID=140不符合任何这些要求。像`/ users / troethom'这样的网址似乎是合乎逻辑的。

这导致了下一点。 hackable URL 是一个用户可以修改并仍会显示结果的URL。如果网址具有黑客性且我的个人资料的网址为/users/troethom,则可以安全删除我的用户名以获取用户列表(/users)。

使用 RESTful URL 非常类似于我的其他建议背后的想法。您正在为用户而不是计算机设计URL,因此URL必须与内容相关,而不是与站点的技术后端相关。作为'/ users'的URL比'/ users / list'更有意义,URL作为'/ category / programming / javascript'(表示'编程'类别中的子类'javascript'优于'/ category / show / 12'。

省略ID确实比较困难,但在我的世界里,这是值得的。

另请参阅有关W3C常见HTTP实施问题的the Understanding URIs section。它在设计URI时有一个常见的陷阱列表。另一个好资源是Resourceful Vs Hackable Search URLs

答案 1 :(得分:3)

您可能需要查看问题“Friendly url scheme?”。

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

答案 2 :(得分: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 });
}

答案 3 :(得分:0)

BilldehÓra撰写了一篇非常好的文章,题为Web resource mapping criteria for frameworks,非常值得一读。

答案 4 :(得分:0)

要添加到troethom的注释,RESTful通常也意味着,例如,创建一个新用户,您将表示为/ users / newusername

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

好吧,这对于网络浏览器来说并不容易,但你总是可以使用重载的POST(发布到/ users / username以及用户的表示来更改某些细节等等。

这是一种很好的做事方式,我推荐阅读RESTFul Web services以便更好地理解:D(这是一本非常好的书!)

答案 5 :(得分:0)

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

MvcContrib project documentation

中描述了一个

而另一个在blog post by Stephen Walther中描述(我个人更喜欢)。