[英]Understanding [HttpPost], [HttpGet] and Complex Actionmethod parameters in MVC
我對MVC的設計模式以及框架都非常陌生。 我也不是非常精通ASP.NET Forms的基礎知識。 但是,我也了解Web開發和HTTP Post和GET的基礎知識。
現在,我已經閱讀了一些MVC教程,雖然我很好地掌握了模式的MVC以及“路由引擎”的工作原理。 然后突然我遇到了一個看起來像下面的代碼:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
我很少看到它的問題:
公共ActionResult索引(MyViewModel模型)?“
由於NyViewModel是一種復雜類型,因此您無法將其作為URL的一部分傳遞。 你怎么稱呼它?
我想我在拼圖中錯過了一個很大的問題,而且兩個問題都是相互關聯的。 但是,需要一些幫助才能理解這種關系
[HttpPost]
屬性告訴路由引擎將該操作方法的任何POST請求發送到另一個方法。 這是一種重載。
當第一種方法不需要任何屬性時,為什么第二種方法用
[HttpPost]
裝飾?
方法的默認值是[HttpGet]
。 因此,不需要任何屬性。
是否有關於何時使用
[Http]
屬性的指南,何時沒有?
理想情況下,屬性應該放在每個方法上,以避免混淆。 隨着您越來越熟悉事物的運作方式,您通常會采用快捷方式(與其他所有內容一樣),並在您知道不必要時省略它們。
由於
MyViewModel
是一種復雜類型,因此您無法將其作為URL的一部分傳遞。 你怎么稱呼它?
數據將根據請求正文中的數據轉換為模型。 這可以作為JSON對象,也可以作為Form數據。 (有一些技巧可以從URL初始化對象,但它們可能有點復雜和高級。)
通常,復雜對象在HTTP主體中傳遞,並使用支持它的動詞,如POST和PUT。 正文內容必須通過模型綁定驗證。 這基本上意味着如果它是帶有Content-Type:application / json的POST請求,它必須從JSON反序列化為MyViewModel。 如果內容是XML,則必須反序列化為XML。
一般約定是首先在URL路徑,查詢和標題中找到所有原始類型,然后在POST(或PUT)主體中找到一個復雜類型。 我相信可以在其他地方放置復雜的類型,但是你會進入類型轉換器和自定義屬性,如果你是初學者,你可能應該這樣做。
當第一種方法不需要任何屬性時,為什么第二種方法用[HttpPost]裝飾? 是否有關於何時使用[Http]屬性的指南,何時沒有?
“[HttpPost]”告訴路由引擎此方法重載僅可通過HTTP POST獲得。 在這種情況下,嘗試使用404未找到PUT / home / index with body。 Index()的無參數版本不需要它,因為它可以使用任何HTTP動詞,包括GET,POST和PUT。
最佳實踐 - 請求處理
最佳做法是僅在控制器中使用公共方法,這些方法將通過視圖或使用json進行維護。 對於控制器中的所有公共方法,最佳做法是使用[HttpGet]
或[HttpPost]
標記它們,或者我不會涵蓋的其他類型之一,因為它們是更多邊緣情況。
這些Http
屬性將該方法限制為僅為這些特定類型的請求提供服務。 雖然默認為[HttpGet]
,但我發現在命名沖突時,在所有情況下不標記[HttpGet]
有時會導致意外行為。
最佳實踐 - PRG
Post-Redirect-Get是一種設計模式,它基本上規定,無論何時您要發送來自POST請求的響應,您都應該重定向到get以發送響應。 這可以防止多種情況,包括在使用后退按鈕時不再發布 。
重定向通常以[HttpPost]
ActionResult的形式使用return RedirectToAction("MyHttpGetAction");
。
發布復雜的模型
您可以通過多種方式發送復雜模型。 主要區別在於,如果您使用的是GET請求,則它位於URL中,如果您使用的是POST請求,則它位於請求標頭中。 如果你使用ajax,那么差異會變得模糊,因為你幾乎總是將它發送到體內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.