我想用一个单独的调用刷新部分视图(main),以减少网络上的流量。该部分视图中包含多个更多的部分视图(子视图)。但是,我不能使用标准的mainpartialview.html(response)方法,因为子部分视图之一与脚本文件有冲突。不过,我想继续使用microsoft.aspnetcore.mvc.viewfeatures JSON,但是,languageForm和translationForm模型中的值是empty.The建议,我发现它要求我使用empty.The,但是对于NET6来说不是。
旧方法
retun 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);
}
}发布于 2022-12-02 05:03:20
在快速浏览内部执行 for return PartialView("viewname");之后。我认为这是将部分视图呈现为字符串所需的最小值;
public async Task<string> Render(MvcViewOptions options, ActionContext context, PartialViewResult result, PartialViewResultExecutor executor)
{
var viewEngineResult = executor.FindView(context, result);
viewEngineResult.EnsureSuccessful(originalLocations: null);
var view = viewEngineResult.View;
using (view as IDisposable)
{
using var writer = new StringWriter();
var viewContext = new ViewContext(
context,
view,
result.ViewData,
result.TempData,
writer,
options.HtmlHelperOptions);
await view.RenderAsync(viewContext);
await writer.FlushAsync();
return writer.ToString();
}
}你会像这样用;
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),
...
});如果付出更多的努力,您可能可以使用Utf8JsonWriter将每个视图html直接呈现给响应体,而无需任何缓存。
https://stackoverflow.com/questions/74650836
复制相似问题