收到 POST 请求但从未调用的操作方法
Action method receiving POST request but is never called
在我的控制器中,我有一个从视图接收响应 (200 OK) 的操作方法,但它从未运行过。视图有一个 Url.Action 向操作方法发送请求,但该方法从未被调用。触发操作会导致出现空白页。
查看:
@model Project.Web.ViewModels.SomeModel
<div class="modal fade" id="@("RemoveThingModal" + Model.Id")" tabindex="-1" role="Dialog" aria-labelledby="@(RemoveThingModal" + Model.Id)">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form id="@("DeleteForm" + Model.Id)" action="@Url.Action("RemoveThing", "Foo")" method="post">
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.SomeNameString)
<div class="modal-header">
<button type="button" class="Close" data-dismiss="modal" aria-label="Close"><span aria-hidden="True">×</span></button>
<h4 class="modal-title" id="@("RemoveThingModal" + Model.Id)">@MainResource.DeleteModalTitle</h4>
</div>
<div class="modal-body col-md-12">
<div>
@MainResource.DeleteModalMessage
<h3>@string.Format("{0}: {1}", @MainResource.DataTableColumnThingName, Model.Name)</h3>
</div>
</div>
<div class="modal-footer col-md-12">
<button type="button" class="btn btn-default" data-dismiss="modal">@MainResource.CancelLink</button>
<button type="submit" id="#@("deleteSubmitButton" + Model.Id)" class="btn btn-danger">@MainResource.RemoveButton</button>
</div>
</form>
</div>
</div>
</div>
控制器(FooController):
[HttpPost]
public ActionResult RemoveThing(int barId)
{
System.Diagnostics.Debug.WriteLine("DEBUG: aaaa");
try {
return RedirectToAction("List");
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
甚至没有调用调试打印语句。在某些时候,它起作用了,但是没有提交更改,并且撤消历史记录丢失了。
- 将视图的 Url.Action 更改为不同控制器中的另一个动作。
- 控制器中的其他操作在从其他视图调用时起作用。
您的操作需要一个名称为 barId
的整数;您正在发送 Id
,因此未找到该操作。这是您需要的:
@model Project.Web.ViewModels.SomeModel
<div class="modal fade" id="@("RemoveThingModal" + Model.Id")" tabindex="-1" role="Dialog" aria-labelledby="@(RemoveThingModal" + Model.Id)">
<div class="modal-dialog" role="document">
<div class="modal-content">
@using (Html.BeginForm("RemoveThing","Foo", FormMethod.Post)
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id, new { id = "barId", Name = "barId" })
@Html.HiddenFor(m => m.SomeNameString)
<div class="modal-header">
<button type="button" class="Close" data-dismiss="modal" aria-label="Close"><span aria-hidden="True">×</span></button>
<h4 class="modal-title" id="@("RemoveThingModal" + Model.Id)">@MainResource.DeleteModalTitle</h4>
</div>
<div class="modal-body col-md-12">
<div>
@MainResource.DeleteModalMessage
<h3>@string.Format("{0}: {1}", @MainResource.DataTableColumnThingName, Model.Name)</h3>
</div>
</div>
<div class="modal-footer col-md-12">
<button type="button" class="btn btn-default" data-dismiss="modal">@MainResource.CancelLink</button>
<button type="submit" id="#@("deleteSubmitButton" + Model.Id)" class="btn btn-danger">@MainResource.RemoveButton</button>
</div>
}
</div>
</div>
</div>
关于行动:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RemoveThing(int barId)
{
System.Diagnostics.Debug.WriteLine("DEBUG: aaaa");
try {
return RedirectToAction("List");
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
添加防伪验证与您的问题无关,但这是防止跨站点脚本攻击的好习惯。
在我的控制器中,我有一个从视图接收响应 (200 OK) 的操作方法,但它从未运行过。视图有一个 Url.Action 向操作方法发送请求,但该方法从未被调用。触发操作会导致出现空白页。
查看:
@model Project.Web.ViewModels.SomeModel
<div class="modal fade" id="@("RemoveThingModal" + Model.Id")" tabindex="-1" role="Dialog" aria-labelledby="@(RemoveThingModal" + Model.Id)">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form id="@("DeleteForm" + Model.Id)" action="@Url.Action("RemoveThing", "Foo")" method="post">
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.SomeNameString)
<div class="modal-header">
<button type="button" class="Close" data-dismiss="modal" aria-label="Close"><span aria-hidden="True">×</span></button>
<h4 class="modal-title" id="@("RemoveThingModal" + Model.Id)">@MainResource.DeleteModalTitle</h4>
</div>
<div class="modal-body col-md-12">
<div>
@MainResource.DeleteModalMessage
<h3>@string.Format("{0}: {1}", @MainResource.DataTableColumnThingName, Model.Name)</h3>
</div>
</div>
<div class="modal-footer col-md-12">
<button type="button" class="btn btn-default" data-dismiss="modal">@MainResource.CancelLink</button>
<button type="submit" id="#@("deleteSubmitButton" + Model.Id)" class="btn btn-danger">@MainResource.RemoveButton</button>
</div>
</form>
</div>
</div>
</div>
控制器(FooController):
[HttpPost]
public ActionResult RemoveThing(int barId)
{
System.Diagnostics.Debug.WriteLine("DEBUG: aaaa");
try {
return RedirectToAction("List");
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
甚至没有调用调试打印语句。在某些时候,它起作用了,但是没有提交更改,并且撤消历史记录丢失了。
- 将视图的 Url.Action 更改为不同控制器中的另一个动作。
- 控制器中的其他操作在从其他视图调用时起作用。
您的操作需要一个名称为 barId
的整数;您正在发送 Id
,因此未找到该操作。这是您需要的:
@model Project.Web.ViewModels.SomeModel
<div class="modal fade" id="@("RemoveThingModal" + Model.Id")" tabindex="-1" role="Dialog" aria-labelledby="@(RemoveThingModal" + Model.Id)">
<div class="modal-dialog" role="document">
<div class="modal-content">
@using (Html.BeginForm("RemoveThing","Foo", FormMethod.Post)
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id, new { id = "barId", Name = "barId" })
@Html.HiddenFor(m => m.SomeNameString)
<div class="modal-header">
<button type="button" class="Close" data-dismiss="modal" aria-label="Close"><span aria-hidden="True">×</span></button>
<h4 class="modal-title" id="@("RemoveThingModal" + Model.Id)">@MainResource.DeleteModalTitle</h4>
</div>
<div class="modal-body col-md-12">
<div>
@MainResource.DeleteModalMessage
<h3>@string.Format("{0}: {1}", @MainResource.DataTableColumnThingName, Model.Name)</h3>
</div>
</div>
<div class="modal-footer col-md-12">
<button type="button" class="btn btn-default" data-dismiss="modal">@MainResource.CancelLink</button>
<button type="submit" id="#@("deleteSubmitButton" + Model.Id)" class="btn btn-danger">@MainResource.RemoveButton</button>
</div>
}
</div>
</div>
</div>
关于行动:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RemoveThing(int barId)
{
System.Diagnostics.Debug.WriteLine("DEBUG: aaaa");
try {
return RedirectToAction("List");
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
添加防伪验证与您的问题无关,但这是防止跨站点脚本攻击的好习惯。