【发布时间】: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