【问题标题】:ASP.NET MVC: Why request is being caught by the wrong method?ASP.NET MVC:为什么请求被错误的方法捕获?
【发布时间】:2025-12-31 00:05:07
【问题描述】:

我正在使用以下助手来包装我的表单:

@using (Html.BeginForm("Edit", "MyController", FormMethod.Post)) { ... }

在我的控制器中,我有两种方法,一种用于加载我的局部视图,另一种用于处理 Post 请求:

    [SomeFilter]
    [ChildActionOnly]
    [AcceptVerbs(HttpVerbs.Get)]
    public PartialViewResult Edit(int id)
    {
       //Some Code
    }

    [SomeFilter]        
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(MyViewModel model, string submit) {
       //Some Code
    }

除了用户提交空表单外,一切似乎都运行良好。在这种情况下,请求被 GET 方法而不是 POST 方法捕获。我知道它正在调用 GET 方法,因为我得到一个异常:

““编辑”操作只能由子请求访问。”

并且只有 GET 重载具有 [ChildActionOnly] 过滤器。我不明白为什么会这样。两者都不同,都经过装饰。

有什么建议吗?

部分查看代码:

@model MVC.Models.MyViewModel 

@using (Html.BeginForm("Edit", "MyController", FormMethod.Post))
{
   @Html.HiddenFor(m => m.Id)
   @Html.AntiForgeryToken()

   <div class="row margin-top-20 form-group text-center">
      <div class="col-md-3 col-lg-offset-2">
         @Html.LabelFor(m => m.ManyItemsAvailable)
         @Html.ListBox("ManyItemsAvailable", Model.ItemsAvailable)
      </div>
      <input type="submit" class="btn btn-default" value=">" id="add" name="submit" />
      <input type="submit" class="btn btn-default margin-top-10" value="<" id="remove" name="submit" />
      <div class="col-md-3">
         @Html.LabelFor(m => m.ManyItemsSelected)
         @Html.ListBox("ManyItemsSelected", Model.ItemsSelected)
      </div>
   </div>
}

【问题讨论】:

  • 你确定它不只是在表单重新加载时被调用吗?我会从浏览器调试它,看看在什么时候调用服务器并将其与浏览器发送的内容相匹配?
  • 这不是@Igor,我有几个断点,一旦我点击提交,它就会抛出异常,永远不会到达控制器,因为它进入了 ChildActionOnly 过滤器。
  • 你能发布你的剃刀观点吗?
  • @StephenZeng 就是这样。
  • 问题是name="submit" - 将其更改为其他任何内容(例如)name="action"(并调整 POST 方法参数以匹配)

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

所以,我用这些替换了两个提交按钮:

<input type="submit" class="btn btn-default" value=">" id="add" name="submit" />
<input type="submit" class="btn btn-default margin-top-10" value="<" id="remove" name="submit" formmethod="post" />

明确指定 formmethod="post" 并且它现在按预期工作。

【讨论】: