2010-09-24 58 views
2

如果这是一个重复,请让我知道 - 因为我有一个快速的样子,找不到任何真正解决我的问题的东西。ASP.NET MVC - 如何创建一个RESTful控制器方案?

我与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) { .. } 

夫妇的上的问题 - 是你将如何命名/ action方法分开?我应该通过整个模型(产品),还是只是ID?

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

在这个阶段,我想我会有3浏览:

  1. 指数” - 结合IEnumerable<Product>模型,列出了所有产品,“编辑”,“详细信息”和“删除“链接
  2. 单个“ - 绑定到单个Product模型,列出产品的所有详细信息,并带有”更新“按钮。
  3. ” - 绑定到单一Product模型,与创建产品的形式,与“创建”按钮。

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

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

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

或者,这是一个愚蠢/矫枉过正的设计,我应该坚持“GET”还是“POST”?

我是(相当)新的这种风格的网络开发(REST),所以请亲切。:)

UPDATE

所以我碰到从斯蒂芬·瓦尔特this有趣的文章,关于这个题目。他表示一个HTML表单只支持GET和POST(因为我是REST风格的网页开发的新手,我甚至不知道这一点,对此我感到部分惭愧)。

显然,使用PUT/DELETE调用Controller操作的唯一方法是使用AJAX来完成。真的吗?

那么我应该在这里做什么,我应该坚持GET/POST,还是我应该创建一个JavaScript文件,其中包含基础XmlHttpRequest代码后面的一个很好的功能?

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

+1

不知道GET和POST是HTML表单的唯一广泛支持,非常常见,所以不要惊慌,你不知道它:) – eglasius 2010-09-24 06:09:48

回答

4

您最熟悉GET和POST的原因是因为常规的旧浏览器只能获取或发布URL,特别是在提交表单时。

以这种方式设置您的控制器,您至少在精神上正在寻找一些更符合REST API和网站的内容。

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

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

如果您不想构建REST API,那么请不要为不使用DELETE而烦恼(只需在URL中使用带有ID的GET)或者你没有使用PUT(只需在POST主体中使用POST产品实体)。

REST对于通过HTTP构建API(没有表示层,以原始格式向使用它们的客户端发送数据,可能是电话或网站等)是一种很好的风格。 HTTP在构建网页方面很好。根据需要使用你需要的东西。

如果您希望构建一个REST API供其他人和您的网站使用,那么请执行此操作,并让网站的控制器操作方法直接调用您的API方法。我一直这么做。使用像Hammock这样的网络客户端来让你更容易。

+1

+1)a)一个很好的答案,b)最后有人回答,嘿嘿。只有点编号是我宁愿做的DELETE与POST,而不是GET。 REST原则规定GET应该能够一遍又一遍地重复执行,而不改变“状态”。不过,在这个阶段我可能会倾向于AJAX,因为网站无论如何都会有很多。欣赏你的答案。 – RPM1984 2010-09-24 05:18:34

+0

@ RPM1984你是对的,DELETE必须用POST完成,而不是GET。 – eglasius 2010-09-24 06:16:21

+0

您不应该为修改数据的任何操作执行GET操作。 GET只是简单的检索。如果您的操作涉及C,U或D(创建,更新或删除),则应使用POST调用。数据损坏的机会太多,如果它只是一个GET来改变事情。 – andymeadows 2010-09-24 06:18:11

0

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

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

至于命名,我会做的:获取,更新,创建,删除,这使得它很清楚。我实际上更喜欢使用与操作相关的动作名称,但对于那些工作正常的简单事物而言。

+1

感谢您的回答。我赞同你。在这个阶段,我只是在做研发,所以我不会决定AJAX与GET&POST。我同意,关于AJAX的决定应该基于UX制定,而不是试图坚持HTTP语义。 – RPM1984 2010-09-24 06:30:24

0
+0

关注elobarate? (是的,我已阅读MSDN页面)。你在MVC中使用过吗?怎么样?无论如何,现在我发现窗体只支持GET/POST(至少HTML5),我看不出这是如何工作的。 – RPM1984 2010-09-24 09:17:48

+0

<%= Html.HttpMethodOverride(HttpVerbs.Put)%> <%= Html.HttpMethodOverride(HttpVerbs.Delete)%> – takepara 2010-09-24 09:43:54

+0

老兄,首先,不要在注释中放置代码 - 编辑您的答案并将其放在那里。其次,这不是对代码如何工作的阐述或解释(这是这个问题的关键)。不过,我会自己研究这种方法。 – RPM1984 2010-09-24 23:25:58