45

したがって、オプションの属性である [HttpPost] があります。これにより呼び出しが制限されるため、HTTP POST 要求によってのみ実行できることを理解しています。私の質問は、なぜこれをやりたいのですか?

4

4 に答える 4

61

次のことを想像してみてください。

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

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

ActionMethodSelectorAttributes が使用されHttpGetていない限り、これは不可能です。HttpPostこれにより、編集ビューの作成が非常に簡単になります。すべてのアクションリンクは、コントローラーを指しているだけです。ビューモデルがfalseと検証された場合は、すぐに編集ビューに戻ります。

私は大胆に、ASP.NETMVCでの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>

フォームが送信されると、コントローラーに対してHttpPostリクエストが実行されます。HttpPost属性を持つアクションがリクエストを処理します。

于 2011-03-16T21:54:01.993 に答える
10

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

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

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

        return View();
    }
于 2011-03-16T21:57:19.693 に答える
10

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

セキュリティに関するより詳細な考慮事項と、検証トークンによってセキュリティが向上する理由については、OWASPを参照してください。

于 2012-03-20T20:41:16.920 に答える
2

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

于 2011-03-16T21:53:57.533 に答える