2013-10-08 48 views
0

我在VS.NET 2010中创建了一个新的MVC web应用程序。我可以访问localhost/Home/Contact而不会出现问题。这是一个内置于示例应用程序中的方法。为什么不提供MVC URL?

我添加了另一个方法:

[HttpPost] 
public ActionResult MyMethod(ClassA content) 
{ 
    return new HttpStatusCodeResult(204); 
} 

当我尝试使用访问此方法:

本地主机/主页/的MyMethod

我得到一个404错误。我直接在浏览器(GET)和POSTing中尝试过。任何想法可能是错误的?

+1

你能告诉我们_how_你发布吗?设计上,你无法通过get请求来达到动作,这就是你用“HttpPost”属性来装饰它的原因。 –

+0

尝试删除'[HttpPost]',然后在浏览器中访问它。 – Nate

回答

1

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

+0

在我的例子中,204还是会被返回,或者HttpPost会阻止它吗? – 4thSpace

+0

@ 4thSpace我认为它应该,如果它能工作,你可以去尝试与提琴手/萤火虫。你为什么要这么'HTTP 204'如此糟糕? –

+0

POST'er需要它。 – 4thSpace

0

此方法只能通过POST访问。

+0

谢谢。如果有人正在对该方法进行POST,但我没有HttpPost属性,它仍然可以正常工作?使用HttpPost的好处是什么 - 仅限POST的限制? – 4thSpace

+0

另外,我回来了204.我应该能够捕获并显示POST'ing页面中的返回权吗?这将解决我的问题。 – 4thSpace

相关问题