2010-09-24 54 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