MVC [HttpPost / HTTPGET]行动(MVC [HttpPost/HttpGet]

2019-06-17 15:07发布

我使用MVC C#。

有人能给为什么人会用一个例子

[HttpPost/HttpGet] 

一个动作。 积极怎样才能兼得 - 有什么实际用途?

Answer 1:

比方说,你有一个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)]



Answer 2:

你不需要在同一时间同时指定,除非你明确限制其他动词(即你不想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);
    }

结果

通过邮递员,格式化由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                                                                                       |


Answer 3:

在MVC 4您可以使用AcceptVerbsAttribute,我觉得这是一个非常干净的解决方案

[AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]
public IHttpActionResult Login()
{
   // Login logic
}


Answer 4:

你不能结合这属性。

但是,你可以把两者在一个操作方法,但你可以自己的逻辑封装成另一种方法,并呼吁从两个操作此方法。

ActionName属性允许有2个ActionMethods具有相同的名称。

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


文章来源: MVC [HttpPost/HttpGet] for Action