.NET Core 6中如何将局部视图转换为JSON/HTML字符串?
问题背景与解决方案
我希望通过单次请求刷新包含多个子局部视图的主局部视图,以此减少网络流量。但其中一个子局部视图存在脚本冲突,无法使用标准的mainpartialview.html(response)方式更新。改用JSON返回时,languageForm和translationForm的模型值为空,且之前找到的依赖microsoft.aspnetcore.mvc.viewfeatures的方案不适用于.NET 6。
旧实现方式
return PartialView("~/Views/Facility/Translation/_PanelMain.cshtml", result);
存在问题的新尝试
return Json(new { languageForm = PartialView("~/Views/Facility/Translation/_Form_Language.cshtml", result.record), translationForm = PartialView("~/Views/Facility/Translation/_PanelSub.cshtml", result.subRecord), translationViewModel = result.subRecord });
经验证的完整解决方案
C# 控制器代码
[HttpGet] public async Task<ActionResult> GetLanguageRecord(long? languageID) { LoadViewBag(); var loadOptions = GetDefaultDataSourceLoadOptions(); var languageList = _languageService.GetGridViewList(GetMembershipID(), null, loadOptions); var translationList = _translationService.GetGridViewList(GetMembershipID(), languageID, loadOptions); var result = PopulateViewModel(languageID ?? 0, 0, languageList, translationList, loadOptions); result.record.TransactionTypeID = SubmissionType.Edit; var services = HttpContext.RequestServices; var options = services.GetRequiredService<IOptions<MvcViewOptions>>().Value; var executor = (PartialViewResultExecutor)services.GetRequiredService<IActionResultExecutor<PartialViewResult>>(); return Json(new { languageForm = await Render( options, ControllerContext, PartialView("~/Views/Facility/Translation/_Form_Language.cshtml", result.record), executor), translationForm = await Render( options, ControllerContext, PartialView("~/Views/Facility/Translation/_PanelSub.cshtml", result.subRecord), executor), translationViewModel = result.subRecord }); }
JavaScript 代码
function grdMain_Language_selection_changed(selectedItems) { var data = selectedItems.selectedRowsData[0]; if (data) { $.ajax({ type: "GET", url: "Translation/GetLanguageRecord", data: { languageID: data.ID }, cache: false, success: function (response) { document.getElementById("_EntryForm_Language").innerHTML = response.languageForm; document.getElementById("_SubPanel").innerHTML = response.translationForm; $('#_subPanel_body').collapse('hide'); $('#_mainPanel_body').collapse('show'); myData_Translation = response.translationViewModel.recordList; myTotalCount_Translation = response.translationViewModel.recordTotal; let gvElement_Translation = document.getElementById("grdSub_Translation"); let gvInstance_Translation = DevExpress.ui.dxDataGrid.getInstance(gvElement_Translation); gvInstance_Translation.refresh(); } }); $(window).scrollTop(0); } }
内容的提问来源于stack exchange,提问作者takde pape
相关产品推荐
相关产品推荐

