我正在尝试添加通过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);
答案 0 :(得分:2)
确保您的控制器方法定义为HttpPost
[HttpPost] // Or [AcceptVerbs(HttpVerbs.Post)]
public ActionMethod DoItemRequest(FormCollection data)
{
}
答案 1 :(得分:0)
首先从Global.asax
现在来发行。 MVC是基于约定的(默认实现)使用它。
@using (Html.BeginForm("DoItemRequest", "ItemRequest", FormMethod.Post))
{
@Html.AntiForgeryToken()
<input type="hidden" name="hid_ItemID" value="" />
<input type="hidden" name="hid_PositionOnPage" value="" />
您必须仅指定Controller Name,而不是ItemRequestController。你的类是ItemRequestController但默认情况下是后缀控制器由MVC添加。因此,当您在BeginForm中使用ItemRequestController时,它将搜索未找到的ItemRequestControllerController类,并抛出异常。
这将解决您的问题。