54

MVC C#を使用しています。

誰かがなぜ使用するのかについて例を挙げてもらえますか

[HttpPost/HttpGet] 

アクションのために。アクティブはどのように両方を持つことができますか?実際の使用法は何ですか?

4

4 に答える 4

88

Loginユーザーにログイン画面を提供し、ユーザーがフォームを送信した後にユーザー名とパスワードを受け取るアクションがあるとします。

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

public ActionResult Login(string userName, string password) {
    // do login stuff
    return View();
}

MVCは、それを見ればわかるとはいえ、どのアクションがどのアクションであるかについて明確な指示を与えられていません。最初のアクションに[HttpGet]を追加し、セクションアクションに[HttpPost]を追加すると、MVCはどのアクションがどれであるかを明確に認識します。

なんで?リクエストメソッドを参照してください。長短:ユーザーがページを表示するとき、それはGETリクエストであり、ユーザーがフォームを送信するとき、それは通常POSTリクエストです。HttpGetとHttpPostは、アクションを適切なリクエストタイプに制限するだけです。

[HttpGet]
public ActionResult Login() {
    return View();
}

[HttpPost]
public ActionResult Login(string userName, string password) {
    // do login stuff
    return View();
}

アクションが複数の動詞からのリクエストを処理する場合は、リクエストメソッドの属性を組み合わせることもできます。

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]

于 2012-08-01T21:37:58.820 に答える
24

他の動詞を特に制限しない限り(つまり、PUTやDELETEなどを望まない場合)、両方を同時に指定する必要はありません。

一部のコメントとは異なり、両方の属性[HttpGet, HttpPost]を同時に使用することもできませんでしたが、代わりに両方の動詞を指定することができました。

行動

    private ActionResult testResult(int id)
    {
        return Json(new {
                            // user input
                            input = id,
                            // just so there's different content in the response
                            when = DateTime.Now,
                            // type of request
                            req = this.Request.HttpMethod,
                            // differentiate calls in response, for matching up
                            call = new StackTrace().GetFrame(1).GetMethod().Name
                        },
                        JsonRequestBehavior.AllowGet);
    }
    public ActionResult Test(int id)
    {
        return testResult(id);
    }
    [HttpGet]
    public ActionResult TestGetOnly(int id)
    {
        return testResult(id);
    }
    [HttpPost]
    public ActionResult TestPostOnly(int id)
    {
        return testResult(id);
    }
    [HttpPost, HttpGet]
    public ActionResult TestBoth(int id)
    {
        return testResult(id);
    }
    [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
    public ActionResult TestVerbs(int id)
    {
        return testResult(id);
    }

結果

POSTMAN経由、markdowntablesによるフォーマット

| Method    | URL                   | Response                                                                                  |
|--------   |---------------------- |----------------------------------------------------------------------------------------   |
| GET       | /ctrl/test/5          | { "input": 5, "when": "/Date(1408041216116)/", "req": "GET", "call": "Test" }             |
| POST      | /ctrl/test/5          | { "input": 5, "when": "/Date(1408041227561)/", "req": "POST", "call": "Test" }            |
| PUT       | /ctrl/test/5          | { "input": 5, "when": "/Date(1408041252646)/", "req": "PUT", "call": "Test" }             |
| GET       | /ctrl/testgetonly/5   | { "input": 5, "when": "/Date(1408041335907)/", "req": "GET", "call": "TestGetOnly" }      |
| POST      | /ctrl/testgetonly/5   | 404                                                                                       |
| PUT       | /ctrl/testgetonly/5   | 404                                                                                       |
| GET       | /ctrl/TestPostOnly/5  | 404                                                                                       |
| POST      | /ctrl/TestPostOnly/5  | { "input": 5, "when": "/Date(1408041464096)/", "req": "POST", "call": "TestPostOnly" }    |
| PUT       | /ctrl/TestPostOnly/5  | 404                                                                                       |
| GET       | /ctrl/TestBoth/5      | 404                                                                                       |
| POST      | /ctrl/TestBoth/5      | 404                                                                                       |
| PUT       | /ctrl/TestBoth/5      | 404                                                                                       |
| GET       | /ctrl/TestVerbs/5     | { "input": 5, "when": "/Date(1408041709606)/", "req": "GET", "call": "TestVerbs" }        |
| POST      | /ctrl/TestVerbs/5     | { "input": 5, "when": "/Date(1408041831549)/", "req": "POST", "call": "TestVerbs" }       |
| PUT       | /ctrl/TestVerbs/5     | 404                                                                                       |
于 2014-08-14T18:57:42.493 に答える
8

Mvc 4ではAcceptVerbsAttributeを使用できますが、これは非常にクリーンなソリューションだと思います

[AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]
public IHttpActionResult Login()
{
   // Login logic
}
于 2015-06-08T17:12:28.120 に答える
5

これを属性に結合することはできません。

ただし、両方を1つのアクションメソッドに配置することはできますが、ロジックを別のメソッドにカプセル化して、両方のアクションからこのメソッドを呼び出すことができます。

属性を使用すると、同じ名前のActionName2つのActionMethodを使用できます。

[HttpGet]
public ActionResult MyMethod()
{
    return MyMethodHandler();
}

[HttpPost]
[ActionName("MyMethod")]
public ActionResult MyMethodPost()
{
    return MyMethodHandler();
}

private ActionResult MyMethodHandler()
{
    // handle the get or post request
    return View("MyMethod");
}
于 2012-08-01T21:37:36.783 に答える