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

Razor Pages中如何通过字符串动态渲染支持Razor语法的分部视图?

在Razor Pages中动态渲染含Razor语法的字符串内容

完全可以实现类似@Html.PartialFromString的功能,核心是借助ASP.NET Core的Razor视图引擎,动态编译并执行带Razor语法的字符串,同时关联当前页面的ViewContext上下文(比如ViewData)。

实现步骤

  1. 创建自定义HTML Helper扩展方法
    新建一个静态类,添加异步扩展方法处理Razor字符串的编译与渲染:
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using System.IO;
using System.Threading.Tasks;

public static class HtmlHelperRazorExtensions
{
    public static async Task<IHtmlContent> RenderRazorStringAsync(this IHtmlHelper htmlHelper, string razorContent)
    {
        // 获取依赖的Razor服务
        var razorViewEngine = htmlHelper.ViewContext.HttpContext.RequestServices.GetService<IRazorViewEngine>();
        var tempDataProvider = htmlHelper.ViewContext.HttpContext.RequestServices.GetService<ITempDataProvider>();

        // 复用当前页面的ViewData和TempData上下文
        var viewData = new ViewDataDictionary(htmlHelper.ViewContext.ViewData);
        var tempData = new TempDataDictionary(htmlHelper.ViewContext.HttpContext, tempDataProvider);
        var actionContext = htmlHelper.ViewContext.ActionContext;

        // 包装Razor字符串为可编译的模板格式
        var razorTemplate = $"@{{ {razorContent} }}";
        var viewResult = razorViewEngine.GetView(null, razorTemplate, isMainPage: false);

        if (!viewResult.Success)
        {
            throw new InvalidOperationException("Razor字符串编译失败,请检查语法是否正确");
        }

        // 渲染模板到字符串
        using var stringWriter = new StringWriter();
        var viewContext = new ViewContext(
            actionContext,
            viewResult.View,
            viewData,
            tempData,
            stringWriter,
            new HtmlHelperOptions()
        );

        await viewResult.View.RenderAsync(viewContext);
        return new HtmlString(stringWriter.ToString());
    }
}
  1. 在Razor Pages中使用
    在页面里直接调用这个扩展方法即可:
@await Html.RenderRazorStringAsync("<h1>McHello @ViewData[\"Title\"]</h1>")

注意事项

  • 性能考量:动态编译Razor字符串存在一定性能开销,若频繁使用相同模板,建议缓存编译后的视图结果。
  • 安全风险:如果渲染的字符串来自用户输入,必须做好XSS过滤,防止恶意脚本注入。
  • 复杂场景扩展:需要传递模型时,可修改扩展方法添加模型参数,更新ViewData或直接传递给视图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:44:59