簡體   English   中英

了解MVC中的[HttpPost],[HttpGet]和Complex Actionmethod參數

[英]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");
    }
}

我很少看到它的問題:

  • 我對路由引擎的理解是控件被傳遞給基於URL 的特定 ActionMethod,而且通常URL基本上是Controller / ActionMethod / Id類型,其中參數to action menthod是Primitive類型。 在上面的這個例子中,調用“需要什么樣的URL”

公共ActionResult索引(MyViewModel模型)?“

由於NyViewModel是一種復雜類型,因此您無法將其作為URL的一部分傳遞。 你怎么稱呼它?

  • 當第一種方法不需要任何屬性時,為什么第二種方法用[HttpPost]裝飾? 是否有關於何時使用[Http]屬性的指南,何時沒有?

我想我在拼圖中錯過了一個很大的問題,而且兩個問題都是相互關聯的。 但是,需要一些幫助才能理解這種關系

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM