首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#网核6如何将部分视图转换为json / html字符串

C#网核6如何将部分视图转换为json / html字符串
EN

Stack Overflow用户
提问于 2022-12-02 04:13:38
回答 1查看 41关注 0票数 0

我想用一个单独的调用刷新部分视图(main),以减少网络上的流量。该部分视图中包含多个更多的部分视图(子视图)。但是,我不能使用标准的mainpartialview.html(response)方法,因为子部分视图之一与脚本文件有冲突。不过,我想继续使用microsoft.aspnetcore.mvc.viewfeatures JSON,但是,languageForm和translationForm模型中的值是empty.The建议,我发现它要求我使用empty.The,但是对于NET6来说不是。

旧方法

代码语言:javascript
复制
retun PartialView("~/Views/Facility/Translation/_PanelMain.cshtml", result);

新途径

代码语言:javascript
复制
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#控制器

代码语言:javascript
复制
[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

代码语言: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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-02 05:03:20

在快速浏览内部执行 for return PartialView("viewname");之后。我认为这是将部分视图呈现为字符串所需的最小值;

代码语言:javascript
复制
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();
    }
}

你会像这样用;

代码语言:javascript
复制
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直接呈现给响应体,而无需任何缓存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74650836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档