.NET5服务器端Blazor组件HTML属性中如何转义@符号?
.NET 5 Blazor 组件属性渲染@符号的实现方法
问题场景
需要通过内置InputText组件,最终渲染出如下原生HTML代码:
<input placeholder="@Handle" class="valid">
先后尝试的两种写法均无法达到预期:
第一种写法可正常编译,但输出结果不符合要求:
<InputText @bind-Value="Handle" placeholder="Handle" /> @* 编译通过,但渲染出的placeholder值缺少开头的@符号 *@第二种写法直接触发编译报错,无法完成构建:
<InputText @bind-Value="Handle" placeholder="@@Handle" />对应报错信息:
RAZORGENERATE : error RZ9986: Component attributes do not support complex content (mixed C# and markup). Attribute: 'placeholder', text: '"@"Handle'
报错根源是Razor的@转义规则在不同上下文的解析逻辑存在差异:
@@转义仅适用于原生HTML标记的渲染场景,在组件参数的解析上下文中,解析器遇到@字符就会将其判定为C#表达式的起始标记,直接写@@会被解析成“固定字符串@拼接Handle变量”的混合内容,触发组件属性不支持复杂混合内容的校验规则。
实现方案
组件参数本身接收的是C#表达式而非原生标记文本,完全可以绕开标记层的转义规则,直接通过C#字符串传递需要的占位符值:
- 内联表达式直接赋值
给placeholder属性显式标记C#表达式起始符,在表达式内直接写包含@的字符串字面量:
解析逻辑:最外层的<InputText @bind-Value="Handle" placeholder="@("@Handle")" />@告诉组件解析器后续为C#代码,代码本身就是固定值的字符串"@Handle",完全不需要经过Razor标记层的@转义流程,不会触发解析报错。 - 代码块预定义常量
如果项目中需要复用这个占位符文本,更推荐在@code块中提前定义常量值,在组件标签上直接引用变量即可:
这种方式不仅能避开标记解析的问题,也能统一维护文案,后续修改占位符内容时不需要频繁调整组件标签的属性值。@* Razor 标记部分 *@ <InputText @bind-Value="Handle" placeholder="_handlePlaceholder" /> @code { private string Handle { get; set; } // 直接在C#字符串中写@符号,无任何转义要求 private const string _handlePlaceholder = "@Handle"; }
内容的提问来源于stack exchange,提问作者Connor Low
相关产品推荐
相关产品推荐

