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
相关产品推荐
相关产品推荐

