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) 
{ 
} 
相关问题