【问题标题】:ASP.NET - PartialView continues using layoutASP.NET - PartialView 继续使用布局
【发布时间】:2020-07-19 21:15:10
【问题描述】:

我有一个由几个步骤组成的结帐流程。出于性能原因,我使用 ajax 部分更新,因此我只想返回不带布局的部分视图。

请注意,我使用的是 ASP.NET Mvc,而不是 ASP.NET Core!

首先,我有一个 index 方法,它加载一个视图,然后将当前订单所在的步骤的一部分。

        public override ActionResult Index(TradeInCheckOutPage currentPage)
    {
        var model = new BaseCheckoutStepViewModel(bulkOrderViewModel, currentPage,
            GetCurrentStep(orderViewModel));
        return View(Index.cshtml", model); // View handles redirect to correct view
    }

该方法的观点:

    if (Model.Step.Equals(CheckoutStep.Confirm))
    {
        Html.RenderAction("confirm", "CheckoutPage",
            new
            {
                currentPageId = Model.CurrentPage.PageId,
            });
    }
    else if (Model.Step.Equals(CheckoutStep.ChooseSenderAddress))
    {
        Html.RenderAction("chooseAddress", "CheckoutPage",
            new
            {
                CurrentPage = Model.CurrentPage.PageId,
                BulkOrderId = Model.BulkOrder.Id
            });
    }

订单处于“确认”状态,因此通过 Html.RenderAction 调用 Confirm 方法。

        public ActionResult Confirm(Guid currentPageId)
    {
        var model = new CheckoutConfirmViewModel(null, GetCurrentPage(currentPageId));

        return View("Confirm.cshtml", model);
    }

该方法的视图,它启动一个局部的 ajax 调用:

   @{
        Layout = "_LayoutCheckOut.cshtml";
    }
    
    @using (Ajax.BeginForm(
    new AjaxOptions
    {
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "content"
    }))
    {
    
    }

我的控制器中有以下代码受到 ajax 调用的影响:

        [HttpPost]
    public ActionResult Confirm(Guid currentPageId, bool confirm = false)
    {          
        if (ModelState.IsValid)
        {

            return chooseAddress(currentPageId, bulkOrder.Id);
        }

        public PartialViewResult chooseAddress(Guid currentPageId, Guid bulkOrderId)
    {
      ...
        return PartialView("ChooseAddress.cshtml", model);
    }

问题是由于某种原因,虽然它是 PartialViewResult,但 chooseAddress 方法 viewresult 仍在使用布局!这是什么原因造成的?

我也尝试在 ChooseAddress 视图中指定 Layout = null,但仍在呈现布局。

【问题讨论】:

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


    【解决方案1】:

    试试:

    Html.RenderPartial("chooseAddress", "CheckoutPage",...
    

    而不是Html.RenderAction("chooseAddress", "CheckoutPage",...

    还将[ChildActionOnly] 属性添加到您的chooseAddress 操作中。这是一个很好的做法。

    【讨论】:

    • 您好,感谢您的意见。我不能使用 Html.RenderPartial,因为我需要调用操作“chooseAddress”,因为它包含构建视图模型的逻辑。根据我在结帐流程中的哪个步骤,可能需要不同的视图模型。
    【解决方案2】:

    我设法解决了这个问题!

    原因是我在 _LayoutCheckOut 中有以下几行(字面意思是这样,用于快速本地设置),它加载了脚本:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.min.js" integrity="sha512-UdIMMlVx0HEynClOIFSyOrPggomfhBKJE28LKl8yR3ghkgugPnG6iLfRfHwushZl1MOPSY6TsuBDGPK2X4zYKg==" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.js" integrity="sha512-f04GBpoqEZhbyjlRTuXeg8FIHDb+xfCJ0LVdqiN1fEl5B3jz3Z0SPe9IxDumOVdTeeXmKMcMJhb26VuGf1Laqw==" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.js" integrity="sha512-Sw6xGAALk16gIMo01Nzur7z1lrF5DLbIy/cd9JiBy4yvcQsXwEnJRMHtTg2/OIO76WGv4C1yR+mCUkOtENKDTA==" crossorigin="anonymous"></script>
    

    显然,当您在视图中加载脚本时,即使它是部分的并且您指定 layout = null,布局仍将被使用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      相关资源
      最近更新 更多