MVC3表单POST失败,“用于访问路径...不允许”

时间:2011-12-30 18:38:43

标签: asp.net-mvc asp.net-mvc-3 c#-4.0 asp.net-mvc-routing http-post

我正在尝试添加通过Javascript在页面上生成的表单帖子。

我开始时定义了以下路线:

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

但是我无法从控制器操作方法中的请求对象中获取表单值。

所以我定义了以下路线:

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

表单定义为:

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

在js函数中,我定义隐藏字段的值(基于点击),然后执行:

document.forms[0].submit();

问题是我现在收到错误......

  

用于访问路径的HTTP谓词POST   

如何解决这个问题,并在我的控制器操作方法中读取POST值?

- 更新 -

不敢相信我忘记添加这个...

我确信有一种更优雅的方式来拉动请求变量......对建议持开放态度。

控制器方法:

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

2 个答案:

答案 0 :(得分:2)

确保您的控制器方法定义为HttpPost

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

答案 1 :(得分:0)

  1. 首先从Global.asax

  2. 中删除您的ignoreroute部分
  3. 现在来发行。 MVC是基于约定的(默认实现)使用它。

    @using (Html.BeginForm("DoItemRequest", "ItemRequest", FormMethod.Post))
    {
    @Html.AntiForgeryToken()
    <input type="hidden" name="hid_ItemID" value="" />
    <input type="hidden" name="hid_PositionOnPage" value="" />
    
  4. 您必须仅指定Controller Name,而不是ItemRequestController。你的类是ItemRequestController但默认情况下是后缀控制器由MVC添加。因此,当您在BeginForm中使用ItemRequestController时,它将搜索未找到的ItemRequestControllerController类,并抛出异常。

    这将解决您的问题。