ASP.NET-PartialView继续使用布局



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

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

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

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
});
}

订单处于"Confirm"状态,因此通过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);
}

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

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

尝试:

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

代替Html.RenderAction("chooseAddress", "CheckoutPage",...

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

我设法解决了这个问题!

原因是我在_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,布局仍然会被使用!

最新更新