如何将Razor页面的Section内容捕获为字符串(无需局部视图)
如何在不创建单独文件/局部视图的情况下捕获Razor页面片段为字符串?
问题描述
我有一段Razor代码,希望先将其存储为字符串而非直接输出给用户。我尝试将代码放入@section块中,再使用RenderSection方法来捕获,示例代码如下:
@section mySection { <div>@(model.thing1), @(model.thing2), @(model.thing3)</div> } @{ // 尝试捕获section到字符串 string thingToCapture = RenderSection("mySection"); // 对字符串做处理 thingToCapture = thingToCapture.Replace("foo", "bar"); // 输出处理后的字符串 Html.Raw(thingToCapture); }
但RenderSection方法并不会返回字符串,而是直接进行渲染。请问是否存在无需创建单独文件和使用局部视图,即可将Razor页面部分输出捕获为字符串的方法?
解决方案
可以通过StringWriter配合文本写入逻辑直接在当前页面内完成捕获,无需额外创建局部视图或文件。
方法一:直接在页面内用StringWriter捕获
@{ string capturedHtml; // 使用StringWriter捕获输出内容 using (var writer = new StringWriter()) { // 在这里编写需要捕获的Razor逻辑,直接通过writer输出 writer.Write("<div>"); writer.Write(model.thing1); writer.Write(", "); writer.Write(model.thing2); writer.Write(", "); writer.Write(model.thing3); writer.Write("</div>"); // 将捕获的内容转为字符串 capturedHtml = writer.ToString(); } // 对字符串进行自定义处理 capturedHtml = capturedHtml.Replace("foo", "bar"); // 输出处理后的内容 @Html.Raw(capturedHtml) }
方法二:封装扩展方法复用捕获逻辑
如果需要多次使用这种捕获逻辑,可以在项目中创建静态扩展类:
public static class HtmlHelperExtensions { public static string Capture(this HtmlHelper html, Action<TextWriter> renderAction) { using (var writer = new StringWriter()) { renderAction(writer); return writer.ToString(); } } }
之后在Razor页面中直接调用:
@{ // 调用扩展方法捕获Razor片段 var capturedHtml = Html.Capture(writer => { writer.Write("<div>"); writer.Write(model.thing1); writer.Write(", "); writer.Write(model.thing2); writer.Write(", "); writer.Write(model.thing3); writer.Write("</div>"); }); // 处理字符串 capturedHtml = capturedHtml.Replace("foo", "bar"); // 输出最终内容 @Html.Raw(capturedHtml) }
两种方式都不需要额外创建文件或局部视图,直接在当前页面内完成Razor片段的捕获与字符串处理。
内容的提问来源于stack exchange,提问作者Brian Heward
相关产品推荐
相关产品推荐

