ASP.NET MVC - 如何创建RESTful控制器方案?

时间:2010-09-24 00:56:46

标签: asp.net asp.net-mvc http rest httpverbs

如果这是重复的,请告诉我 - 因为我快速查看,找不到真正回答我问题的任何内容。

我正在尝试ASP.NET MVC 2.现在来自Web窗体背景,我只处理 HTTP GET HTTP 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. 单个” - 绑定到单个Product模型,列出产品的所有详细信息,并带有“更新”按钮。
  3. ” - 使用“创建”按钮与创建产品的表单绑定到单个Product模型。
  4. 所以 - 我的问题是,如何指定我想用特定的HTTP动词调用特定的控制器方法?

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

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

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

    我(相当)对这种网页开发风格(REST)不熟悉,所以请善待。 :)

    更新

    所以我在斯蒂芬·沃尔特(Stephen Walther)看到了有关这个主题的this有趣文章。

    他表示HTML表单只支持GET和POST(因为我是REST风格的Web开发新手,我甚至不知道这一点,我感到有些惭愧)。

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

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

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

3 个答案:

答案 0 :(得分:4)

您最熟悉GET和POST的原因是因为普通的旧浏览器只能GET或POST一个URL,特别是在提交表单时。

以这种方式设置您的控制器,您至少在精神上看待更多关于REST API和网站的内容。

是的,你是对的,只有AJAX请求可以明确地设置他们的请求方法,所以如果你要执行像通过AJAX删除产品这样的操作你会很高兴(在这种情况下我建议只传递ID)因为它比序列化整个产品轻得多,而且您可以轻松访问标记中的ID。

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

如果你不想构建一个REST API,那就不要忘记你没有使用DELETE(只是在URL中使用GET和ID),或者你没有使用PUT(只需使用POST)使用POST主体中的产品实体。)

REST是一种很好的风格,可以通过HTTP构建API(没有表示层,以原始格式将数据发送给使用它们的客户,可能是电话或网站等)。 HTTP本身就很适合构建网页。根据您的需要使用您需要的东西。

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

答案 1 :(得分:0)

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

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

至于命名,对于那些我要做的事:获取,更新,创建,删除,这使得它非常清楚。我实际上更像是一个与操作有关的动作名称,但对于简单的事情来说,这些工作正常。

答案 2 :(得分:0)