MVC C#を使用しています。
誰かが使用する理由の例を与えることができます
[HttpPost/HttpGet]
アクションのために。アクティブな人はどのように両方を持つことができますか-実用的なものは何ですか?
ユーザーにログイン画面を提供し、ユーザーがフォームを送信した後にユーザー名とパスワードを受け取る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)]
。
other動詞を具体的に制限しない限り、両方を同時に指定する必要はありません(つまり、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 |
Mvc 4ではAcceptVerbsAttributeを使用できますが、これは非常にクリーンなソリューションだと思います
[AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]
public IHttpActionResult Login()
{
// Login logic
}
これを属性に結合することはできません。
ただし、1つのアクションメソッドに両方を配置できますが、ロジックを別のメソッドにカプセル化し、両方のアクションからこのメソッドを呼び出すことができます。
ActionName
属性は、同じ名前の2つの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");
}