我使用MVC C#。
有人能给为什么人会用一个例子
[HttpPost/HttpGet]
一个动作。 积极怎样才能兼得 - 有什么实际用途?
我使用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)]
。
你不需要在同一时间同时指定,除非你明确限制其他动词(即你不想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 |
在MVC 4您可以使用AcceptVerbsAttribute,我觉得这是一个非常干净的解决方案
[AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]
public IHttpActionResult Login()
{
// Login logic
}
你不能结合这属性。
但是,你可以把两者在一个操作方法,但你可以自己的逻辑封装成另一种方法,并呼吁从两个操作此方法。
该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");
}