ASP.NET MVC2视图:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcMusicStore.ViewModels.PaymentViewModel>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
...
<form action="<%= Html.Action("PaymentByBankTransfer", "Checkout") %>" >
<input type="submit" value="Payment by bank transfer" />
</form>
CheckoutController:
public ActionResult PaymentByBankTransfer()
{
var order = Session["Order"] as Order;
ExecCommand(@"update dok set confirmed=true where order={0}", order.OrderId);
return CheckoutCompleteOK();
var cart = ShoppingCart.GetCart(HttpContext);
cart.EmptyCart();
// https://stackoverflow.com/questions/1538523/how-to-get-an-asp-net-mvc-ajax-response-to-redirect-to-new-page-instead-of-inser?lq=1
return JavaScript("window.location = '/Checkout/CompleteOK'");
}
// common method called from other controller methods also
public ActionResult CheckoutCompleteOK()
{
var cart = ShoppingCart.GetCart(HttpContext);
cart.EmptyCart();
// prevent duplicate submit if user presses F5
return RedirectToAction("Complete");
}
public ActionResult Complete()
{
var order = Session["Order"] as Order;
SendConfirmation(order);
return View("PaymentComplete", order);
}
按表单提交按钮会导致异常
Child actions are not allowed to perform redirect actions
代码显示来自
的最受欢迎的答案尝试修复它,但这会导致其他错误:浏览器尝试打开网址window.location = '/Checkout/CompleteOK'
如何修复此异常?一切看起来都不错,没有其他答案中描述的部分视图。 我尝试在表单中使用method ='post'属性,但问题仍然存在。
答案 0 :(得分:4)
不使用javascript进行重定向: 如果将表单放在子视图中,有时如果在Beginform帮助器(子视图内)中指定操作名称和控制器名称,则不会发生此问题。例如,我改变了我的子动作视图:
之前:
@using (Html.BeginForm())
{
...
}
之后:
@using (Html.BeginForm("InsertComment", "Comments", FormMethod.Post, new { id = "commentform" }))
{
...
}
现在,您可以将RedirectAction命令放在“InsertComment”操作中,一切都会正常工作。
答案 1 :(得分:3)
不是在帖子上调用public ActionResult CheckoutCompleteOK()
,而是删除该操作并为public ActionResult PaymentByBankTransfer()
创建HTTP发布操作。
然后在PaymentByBankTransfer post方法中返回RedirectToAction("Complete");
。
我认为这可以解决您的问题。