如何修复不允许子操作执行重定向操作,其他答案无法修复

时间:2012-12-15 21:20:03

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

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

代码显示来自

的最受欢迎的答案

How to get an ASP.NET MVC Ajax response to redirect to new page instead of inserting view into UpdateTargetId?

尝试修复它,但这会导致其他错误:浏览器尝试打开网址window.location = '/Checkout/CompleteOK'

如何修复此异常?一切看起来都不错,没有其他答案中描述的部分视图。 我尝试在表单中使用method ='post'属性,但问题仍然存在。

2 个答案:

答案 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");

我认为这可以解决您的问题。