web-dev-qa-db-ja.com

MVCのHttpPostとHttpGet属性:HttpPostを使用する理由

したがって、オプションの属性である[HttpPost]があります。これは呼び出しを制限するので、HTTP POST要求によってのみ行うことができます。これを行う理由は何ですか?

39

以下を想像してください:

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

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

ActionMethodSelectorAttributesHttpGetおよびHttpPostが使用されている場合を除き、これは不可能です。これにより、編集ビューを簡単に作成できます。すべてのアクションリンクは、コントローラーを指すだけです。ビューモデルがfalseを検証した場合は、再び編集ビューに戻ってください。

私は大胆に、これがASP.NET MVCのCRUDishに関してはベストプラクティスであると言います。

編集:

@TheLightは、投稿を達成するためにビューに必要なものを尋ねました。これは単にメソッドPOSTを備えた単なるフォームです。

Razorを使用すると、これは次のようになります。

@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属性を持つアクションがリクエストを処理します。

57
Mikael Östberg

HttpGetおよびHttpPostのベストプラクティスに関する限り、Web開発では、作成、更新、削除(データの変更)にHttpPostを使用することをお勧めします。投稿はフォーム送信が必要であるため、ユーザーは電子メールやソーシャルサイトなどでポイズニングされたリンク([- https://www.mysite.com/Delete/1] )をクリックできません。 。不注意によるデータの変更。あなたが基本的にデータを読むだけなら、HttpGetはうまく機能します。

詳細なセキュリティの考慮事項と、検証トークンがセキュリティを高める理由については、 [〜#〜] owasp [〜#〜] を参照してください。

9
Paul Syfrett

そのため、同じ名前を使用する複数のアクションを持つことができます。HttpPost属性を使用して、Postリクエストで処理されるメソッドを次のようにマークできます。

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

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

        return View();
    }
9
Chris Almond

これは主に、同じ名前の2つのアクションを持つことができるようにするためです。1つはGETで使用され、ユーザー入力用のフォームを表示します。このようにアクションが区別されない場合、どのアクションがリクエストを処理するのかを解決できないため、エラーが発生します。

2
Adam Price