2013-10-08 47 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

相關問題