HttpPost
属性指示该操作只能通过POST
请求访问,它保护您免受其他请求类型(GET,PUT等)的影响。
POST
请求也会在没有该属性的情况下工作,但GET
请求也会!这可能会暴露通过GET请求插入,更新或删除数据的数据库查询,这是不好的做法。想象谷歌索引这样一个页面:www.mysite.com/Users/Delete/{id}
,如果您接受GET
请求,它可能会删除您的完整用户群。
GET
是检索数据,而POST
是提交数据。有关更多信息,请参阅this question。
有不同的方法来启动POST
请求。
你可以用一个形式里面Html.BeginForm()
:
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.UserName);
@Html.TextBoxFor(m => m.UserName);
@Html.LabelFor(m => m.Password);
@Html.PasswordFor(m => m.UserName);
<input type="submit" value="Login" />
}
或通过jQuery.post()
:
$.post(
'@Url.Action("MyMethod", "Home")',
{
// data for ClassA.
name: $('#username').val(); // example.
},
function (result) {
// handle the result.
});
但这GET
要求不会工作,如果你装饰了HttpPost
属性你的行动:
$.get(
'@Url.Action("MyMethod", "Home")',
function (result) {
// this will not work.
});
或者如果您尝试通过浏览器访问它。 另请参阅this blogpost。
你能告诉我们_how_你发布吗?设计上,你无法通过get请求来达到动作,这就是你用“HttpPost”属性来装饰它的原因。 –
尝试删除'[HttpPost]',然后在浏览器中访问它。 – Nate