2011-03-16 31 views

回答

52

想象一下以下內容:

[HttpGet] 
public ActionResult Edit(int id) { ... } 

[HttpPost] 
public ActionResult Edit(MyEditViewModel myEditViewModel) { ... } 

除非ActionMethodSelectorAttributesHttpGetHttpPost用在了這將是不可能的。 這使得創建編輯視圖非常簡單。所有的操作鏈接都直接指向控制器。如果視圖模型驗證爲false,則只需再次彈回到編輯視圖。

我會大膽的說,這是最好的實踐,當涉及到在ASP.NET MVC CRUD的東西。

編輯:

@TheLight問什麼,需要在視圖完成後。這只是一個POST方法的表單。

使用剃刀,這看起來像這樣。

@using (Html.BeginForm()) 
{ 
    <input type="text" placeholder="Enter email" name="email" /> 
    <input type="submit" value="Sign Up" /> 
} 

這使得下面的HTML:

<form action="/MyController/Edit" method="post">  
    <input type="text" name="email" placeholder="Enter email"> 
    <input type="submit" value="Sign Up"> 
</form> 

當表單提交,其將執行HTTP POST請求到控制器。具有HttpPost屬性的動作將處理該請求。

+1

嗨Mikael,我喜歡你的答案,但我看到一個小的更正。 HttpGet和HttpPost不是ActionFilters,但它們是ActionSelectors。作爲名稱,ActionSelectors與ActionFilters不同。如果您看到源代碼都是HttpGet和HttpPost,則它們源自直接從屬性派生的ActionMethodSelectorAttribute。你可以將ActionFilters這個詞替換成ActionSelectors嗎? – VJAI 2013-01-10 10:08:29

+0

謝謝你的擡頭,馬克! – 2013-01-10 13:50:18

+0

應該在視圖上寫下什麼內容才能發佈到此操作? – 2013-02-26 10:03:51

2

這主要是爲了讓您可以有兩個操作具有相同的名稱, 一個這是對GET和可能用於顯示用戶輸入和員額正在使用的其他形式,當用戶提交的顯示形式原始的GET。如果操作沒有以這種方式區分,則由於無法解析哪個操作旨在處理請求而發生錯誤。

8

它讓你可以有使用相同名稱的多個操作,您可以使用HttpPost屬性,以紀念其方法大幹快上,像這樣一個POST請求處理:

public ActionResult ContactUs() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult ContactUs(ContactUsModel model) 
    { 
     //do something with model 

     return View(); 
    } 
+1

也許最好注意POST請求有可能以某種方式改變數據庫的狀態或修改網站的內部數據。這就是網絡抓取工具從不遵循這些網址的原因。 – vbocan 2011-03-17 05:38:04

+1

我不認爲今天的爬蟲對於改變一個人的數據庫或者修改內部數據都不在乎。如果抓取工具能成功找到通過post請求處理程序的方式,那麼這是不足的 – 2012-03-16 06:55:18

+0

- 我將在服務器端進行驗證。爲什麼抓取程序不主動跟蹤帖子請求是因爲有無數的請求排列,並且在大多數情況下,它們使用Captcha等進行保護。 – 2012-03-16 07:01:34

9

爲HTTPGET至於最佳實踐和HttpPost,在任何Web開發中使用HttpPost進行創建,更新和刪除(數據修改)都是很好的做法。 Post很好,因爲他們需要表單提交,這可以防止用戶點擊電子郵件,社交網站等中的有毒鏈接(例如[https://www.mysite.com/Delete/1])),並且無意中更改數據。如果你基本上只是閱讀數據HttpGet的偉大作品。

請參閱OWASP瞭解更深入的安全考慮以及驗證令牌爲何會提高安全性。