当前位置: 首页 > news >正文

Asp.net core mvc中TagHelper的GetChildContentAsync和Content区别

当看到官网上有关介绍TagHelper的代码片段,如下内容:

var childContent = output.Content.IsModified ? output.Content.GetContent() :(await output.GetChildContentAsync()).GetContent();

不知道到其中的(await output.GetChildContentAsync()).GetContent() 和 output.Content.GetContent() 的区别。

查看Api介绍信息:

GetChildContentAsync()

异步执行子级并返回其呈现的内容。

TagHelperOutput.Content 属性

获取或设置 HTML 元素的main内容

查看过后还是不知道所以然。所以深入了解了一下。

核心区别对比表

特性(await GetChildContentAsync()).GetContent()output.Content.GetContent()
内容来源标签内部的原始内容(Razor 视图中写在标签内的 HTML / 文本)当前 TagHelper 已设置的输出内容
处理阶段触发后续 TagHelper 处理后获取最终内容获取当前 TagHelper 已生成的内容(可能未完成)
内容状态包含所有后续 TagHelper 修改后的内容仅包含当前 TagHelper 已设置的内容
典型场景读取并处理用户在标签内写的原始内容(如<my-tag>用户内容</my-tag>修改已生成的输出(如添加包装标签、替换文本)
调用时机ProcessAsync中,通常在修改内容前ProcessAsync末尾,或后续 TagHelper 中

详细解释

1. (await GetChildContentAsync()).GetContent()
  • 作用:获取标签内部的原始内容,并等待所有后续 TagHelper 处理完成。
  • 执行流程
    1. 调用GetChildContentAsync()触发 Razor 引擎处理标签内的内容(包括执行其他 TagHelper、解析 Razor 表达式)。
    2. await等待处理完成后,通过GetContent()将结果转为字符串。
  • 示例
// 标签定义:<my-tag>Hello <strong>World</strong></my-tag>
var innerHtml = (await output.GetChildContentAsync()).GetContent();
// innerHtml 值:"Hello <strong>World</strong>"(经过所有后续TagHelper处理后)
2. output.Content.GetContent()
  • 作用:获取当前 TagHelper 已设置的输出内容。
  • 执行流程
    • 直接读取output.Content属性(可能是之前的 TagHelper 设置的,或当前 TagHelper 已生成的)。
  • 示例
// 当前TagHelper中设置内容
output.Content.SetHtmlContent("<div>Initial Content</div>");// 读取已设置的内容
var currentContent = output.Content.GetContent();
// currentContent 值:"<div>Initial Content</div>"

关键应用场景

场景 1:读取并修改用户提供的内容
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{// 获取用户在标签内写的内容string innerHtml = (await output.GetChildContentAsync()).GetContent();// 添加前缀output.Content.SetHtmlContent($"<div class=\"prefix\">{innerHtml}</div>");
}
场景 2:在后续 TagHelper 中修改输出
// 第一个TagHelper设置初始内容
public class FirstTagHelper : TagHelper
{public override void Process(TagHelperContext context, TagHelperOutput output){output.Content.SetHtmlContent("<p>Original Content</p>");}
}// 第二个TagHelper读取并修改内容
public class SecondTagHelper : TagHelper
{public override void Process(TagHelperContext context, TagHelperOutput output){string existingContent = output.Content.GetContent();output.Content.SetHtmlContent($"<div class=\"wrapper\">{existingContent}</div>");}
}

注意事项

  1. 避免循环调用

    • GetChildContentAsync()之后调用output.Content.Set...会覆盖原始内容。
    • 示例:
      var childContent = await output.GetChildContentAsync();
      output.Content.SetHtmlContent("New Content"); // 覆盖原始内容
      var contentString = output.Content.GetContent(); // 返回"New Content"
  2. 同步与异步的区别

    • GetChildContentAsync()必须在异步方法中使用(ProcessAsync)。
    • 在同步的Process方法中,只能使用output.Content.GetContent()(需确保内容已生成)。
  3. 内容缓存

    • 多次调用GetChildContentAsync()返回相同结果(内容会被缓存),除非手动清除。

总结

  • (await GetChildContentAsync()).GetContent():用于获取并处理标签内部的原始内容,适用于需要读取用户输入的场景。
  • output.Content.GetContent():用于获取或修改当前已生成的输出内容,适用于后续处理或包装已有内容的场景。

理解这两个调用的差异,能帮助你精准控制 TagHelper 的内容处理流程,避免意外的内容覆盖或逻辑错误。

http://www.dtcms.com/a/298221.html

相关文章:

  • GC8871刷式直流电机驱动器深度解析:3.6A驱动与内置电流检测技术
  • 虚拟地址-物理地址
  • leetcode110:判断平衡二叉树(两种思路对比)
  • 渗透高级-----测试复现(第三次作业)
  • 【GoLang#2】:基础入门(工具链 | 基础语法 | 内置函数)
  • 基于STM32汽车自动智能雨刷检测雨滴系统设计
  • 汽车免拆诊断案例 | 2010款奔驰E200 CGI车EPS OFF灯异常点亮
  • 数据类型选择:存储效率与查询性能的平衡
  • 【redis】缓存穿透、缓存击穿、缓存雪崩区别
  • Java学习第七十三部分——Redis
  • 前端面试问题
  • 安卓小说阅读软件推荐
  • 深入解析HBase如何保证强一致性:WAL日志与MVCC机制
  • [尚庭公寓]14-找房模块
  • 手写A2C(FrozenLake环境)
  • 直播美颜SDK动态贴纸模块开发指南:从人脸关键点识别到3D贴合
  • kiro的介绍和安装
  • 7.文件操作:让程序读写文件 [特殊字符]
  • CentOS 7.9 + GCC9 离线安装 IWYU(Include What You Use)
  • Linux库——库的制作和原理(1)_回顾动静态库、制作使用库
  • 【服务器与部署 26】配置管理实战:Ansible、Puppet自动化配置管理让运维效率提升10倍
  • 电磁兼容二:共模和差模问题
  • 【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件
  • Spring Boot 整合 MyBatis 与 Druid 数据源全流程
  • 《整合Spring Cache:本地缓存、Redis与Caffeine对比实践》
  • 7.25总结
  • 详解Python标准库之内置函数
  • 20255年第四届创新杯(原钉钉杯)参考论文+标准答案发布
  • 融合与智能:AI 时代数据库的进化之路
  • Low DK(低介电常数)板材的好处: