2

如果这是重复的,请告诉我 - 因为我快速浏览了一下,找不到任何真正回答我问题的东西。

我正在试验 ASP.NET MVC 2。现在来自 Web 窗体背景,我只真正处理了HTTP GETHTTP POST

我正在尝试查看如何将GET/PUT/POST/DELETE应用于我的存储库上的相应CRUD操作(查找、插入、更新、删除)。

假设我有一个控制器,具有以下操作方法:

[HttpGet] // GET: /Products/{id}
[ActionName("Products")
public ActionResult Get(int id = 0) { ... }

[HttpPut] // PUT: /Products
[ActionName("Products")
public ActionResult Put(Product product) { ... }

[HttpPost] // POST: /Products/{product}
[ActionName("Products")
public ActionResult Post(Product product) { ... }

[HttpDelete] // DELETE: /Products/{product}
[ActionName("Products")
public ActionResult Delete(Product product) { .. }

对此有几个问题 - 您将如何命名/分隔操作方法?我应该通过整个模型(产品),还是只通过 id?

我遇到的问题是我不确定如何处理在我的视图中使用相关 HTTP 动词调用这些操作方法。

在这个阶段,我想我会有 3 个视图:

  1. 索引” - 绑定到IEnumerable<Product>模型,列出所有产品,带有“编辑”、“详细信息”和“删除”链接
  2. Single ” - 绑定到单个Product模型,列出产品的所有详细信息,并带有“更新”按钮。
  3. 新建” - 绑定到单个Product模型,带有用于创建产品的表单,带有“创建”按钮。

所以 - 我的问题是,我如何指定我想用特定的 HTTP 动词调用特定的控制器方法?

使用Html.BeginForm,您可以指定一个FormMethod枚举 - 但它只有 GET 和 POST。

  • 如何执行 PUT 和 DELETE 命令?
  • 我需要为每个 HTTP 动词提供单独的视图吗?
  • 如果我有一个名为“Delete”的链接,我可以向我的控制器调用 HTTP DELETE 命令,还是需要使用表单操作删除将其重定向到新视图?

或者,这首先是一个愚蠢/矫枉过正的设计,我应该坚持使用“GET”和“POST”吗?

我对这种 Web 开发 (REST) 风格(相当)陌生,所以请善待。:)

更新

所以我看到了 Stephen Walther 写的这篇关于这个话题的有趣文章。

他指出 HTML 表单仅支持 GET 和 POST(因为我是 REST 风格的 Web 开发新手,我什至不知道这一点,对此我感到有些羞愧)。

显然,使用 PUT/DELETE 调用控制器操作的唯一方法是使用 AJAX。严重地?

那么我应该在这里做什么,我应该坚持使用 GET/POST,还是应该创建一个 JavaScript 文件,将底层 XmlHttpRequest 代码包装在一个不错的函数后面?

ASP.NET MVC 开发人员倾向于哪种方式?肯定有人问过自己同样的问题。

4

3 回答 3

4

您最熟悉 GET 和 POST 的原因是因为常规的旧浏览器只能 GET 或 POST 一个 URL,尤其是在提交表单时。

以这种方式设置你的控制器,你看到的东西更像是 REST API 与网站,至少在精神上。

是的,您是正确的,只有 AJAX 请求才能显式设置其请求方法,所以如果您要执行诸如通过 AJAX 删除产品之类的操作,那么您就可以开始了(在这种情况下,我建议只传递 ID,因为它是比序列化整个产品要轻得多,并且您可能可以轻松访问标记中的 ID)。

事情就是这样。如果您正在构建一个现代 Web 应用程序,那么您可能正在使用 AJAX,并且不会过于教条化,您应该期望您的用户拥有 JavaScript。如果您想在没有 AJAX 的情况下进行 CRUD,那么您始终可以 POST 产品或使用 GET 作为 URL 中带有 ID 的删除方法(请注意,请确保 Delete 方法在授权后受到保护,否则网络爬虫会很乐意使用您的获取并删除您的所有数据...)

如果您不想构建 REST API,请不要担心您没有使用 DELETE(只需使用 GET 和 URL 中的 ID)或者您没有使用 PUT(只需对产品使用 POST POST 正文中的实体)。

REST 是一种通过 HTTP 构建 API(无表示层,以原始格式发送给使用它们的客户端的数据,可以是电话或网站等)的绝佳风格。HTTP 本身非常适合构建网页。用你需要的东西来做你需要的东西。

如果您想构建一个可供其他人和您的网站使用的 REST API,那么就这样做,并让您的网站的控制器操作方法直接调用您的 API 方法。我一直这样做。使用像 Hammock 这样的 Web 客户端可以让您更轻松。

于 2010-09-24T05:04:57.673 回答
0

就我个人而言,我坚持尽可能简单的完整请求,而不是全部使用 AJAX。我使用 ajax,但在它增强体验的特定地方(我使用渐进式 javascript 方法)。

由于上述原因,我总是只使用 GET 和 POST。

至于命名,我会这样做:获取、更新、创建、删除,这很清楚。实际上,我使用更像是与操作相关的操作名称,但对于简单的事情,这些名称可以正常工作。

于 2010-09-24T06:15:21.937 回答
0

HtmlHelper.HttpMethodOverride 方法 (System.Web.Mvc)

这个怎么样?

于 2010-09-24T09:13:57.473 回答