如果这是重复的,请告诉我 - 因为我快速查看,找不到真正回答我问题的任何内容。
我正在尝试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个观点:
IEnumerable<Product>
模型,列出所有产品,并带有“编辑”,“详细信息”和“删除”链接Product
模型,列出产品的所有详细信息,并带有“更新”按钮。Product
模型。所以 - 我的问题是,如何指定我想用特定的HTTP动词调用特定的控制器方法?
使用Html.BeginForm
,您可以指定FormMethod
枚举 - 但它只有GET和POST。
或者,这首先是一个愚蠢/矫枉过正的设计,我应该坚持使用“GET”和“POST”吗?
我(相当)对这种网页开发风格(REST)不熟悉,所以请善待。 :)
更新
所以我在斯蒂芬·沃尔特(Stephen Walther)看到了有关这个主题的this有趣文章。
他表示HTML表单只支持GET和POST(因为我是REST风格的Web开发新手,我甚至不知道这一点,我感到有些惭愧)。
显然,使用PUT / DELETE调用Controller操作的唯一方法是使用AJAX。严重?
那么我应该在这里做什么,我应该坚持使用GET / POST,还是应该创建一个JavaScript文件,将基础XmlHttpRequest代码包装在一个很好的函数后面?
ASP.NET MVC开发人员倾向于哪种方式?当然有人问自己同样的问题。
答案 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)