You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5中PartialView多PartialAsync嵌套时视图转字符串失效

Razor视图循环渲染PartialAsync返回空字符串的问题分析

问题场景

我使用以下方法将Razor视图渲染为字符串:

public static string RenderRazorViewToString(string viewName, object model, ViewDataDictionary viewData, ITempDataDictionary tempData, ControllerContext controllerContext)
{
    var viewEngine = controllerContext.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
    viewData.Model = model;
    using (var sw = new StringWriter())
    {
        var viewResult = viewEngine.FindView(controllerContext, viewName, false);
        var viewContext = new ViewContext(controllerContext, viewResult.View,
            viewData, tempData, sw, new HtmlHelperOptions());
        viewResult.View.RenderAsync(viewContext)
            .Wait();
        var renderedView = sw.GetStringBuilder().ToString();
        return renderedView;
    }
}

单个调用Html.PartialAsync的局部视图可正常渲染:

@model News

@{
    var news = @Model;
}
@await Html.PartialAsync("SingleView", new SingleViewModel(news));

但在局部视图中通过foreach循环多次调用Html.PartialAsync时,RenderAsync返回空字符串:

@model List<News>
@{ var newsList = Model; }
@foreach (var news in newsList)
{
    await Html.PartialAsync("SingleView", new SingleViewModel(news));
}

问题原因

核心问题是循环代码块内未显式输出PartialAsync的渲染结果:

  • 单个调用时,@await ...属于Razor表达式语法,会自动将PartialAsync返回的IHtmlContent对象写入当前视图的输出流。
  • 而在{}包裹的代码块内部,Razor不会自动处理异步方法的返回值,仅执行await Html.PartialAsync()只会完成渲染操作,但不会把结果写入到视图的StringWriter中,最终导致输出为空。

解决方法

修改循环内代码,添加@符号显式输出渲染结果:

@model List<News>
@{ var newsList = Model; }
@foreach (var news in newsList)
{
    @await Html.PartialAsync("SingleView", new SingleViewModel(news));
}

这样每次调用PartialAsync生成的内容都会被写入输出流,RenderRazorViewToString就能获取到完整的渲染字符串。

内容的提问来源于stack exchange,提问作者signum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:10:56