1

我試圖添加通過JavaScript在頁面上生成的表單發佈。MVC3表單POST失敗,'用於訪問路徑...不允許'

我開始了定義了以下路線:

routes.MapRoute(name: "ItemLinks", url: "ItemRequestController/DoItemRequest", defaults: new { controller = "ItemRequest", action = "DoItemRequest" }); 

但我不能讓我的控制器的操作方法從請求對象的表單值。

所以我定義的以下路線:隱藏字段的

@using (Html.BeginForm("DoItemRequest", "ItemRequestController", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 
    <input type="hidden" name="hid_ItemID" value="" /> 
    <input type="hidden" name="hid_PositionOnPage" value="" /> 

在js函數,我定義的值(基於點擊):

routes.IgnoreRoute("ItemRequestController/{*pathInfo}"); 

作爲表單定義,那麼這樣做:

document.forms[0].submit(); 

問題是,我現在得到錯誤...

不允許使用HTTP動詞POST訪問路徑 '/ ItemRequestController/DoItemRequest'。

如何解決此問題,並在我的控制器操作方法中讀取表單POST值?

- 更新 -

無法相信我忘了添加這個...

我敢肯定有拉動的請求VAR的更優雅的方式......開放建議。

控制器的方法:

[ValidateAntiForgeryToken] 
[HttpPost] 
public ActionResult DoItemRequest() 
{ 
    int itemListID = 0; 
    int pagePositionNumber = 0; 
    int.TryParse(Request["itemListID"], out itemListID); 
    int.TryParse(Request["pagePositionNumber"], out pagePositionNumber); 
+1

你的控制器方法是什麼樣的?你是否限制了該方法允許的動詞? – 2011-12-30 18:41:03

+0

@GarrettVlieger - 忘記發佈控制器方法簽名。以上更新。 – ElHaix 2011-12-31 00:13:17

回答

0
  1. 從Global.asax中

    首先刪除您ignoreroute部分
  2. 現在來問題。 MVC是基於約定的(默認實現)使用這個。

    @using (Html.BeginForm("DoItemRequest", "ItemRequest", FormMethod.Post)) 
    { 
    @Html.AntiForgeryToken() 
    <input type="hidden" name="hid_ItemID" value="" /> 
    <input type="hidden" name="hid_PositionOnPage" value="" /> 
    

你必須指定控制器名稱僅ItemRequest不ItemRequestController。您的類是ItemRequestController,但默認情況下是由MVC添加的後綴控制器。因此,當您在BeginForm中使用ItemRequestController時,它將搜索未找到並引發異常的ItemRequestControllerController類。

這將解決您的問題。

2

確保您的控制器方法是defind作爲HttpPost

[HttpPost] // Or [AcceptVerbs(HttpVerbs.Post)] 
public ActionMethod DoItemRequest(FormCollection data) 
{ 
} 
相關問題