根据https://blog.cindypotvin.com/character-encodings-with-razor-helpers/和其他一些资源@Helper块返回一个实现IHtmlString的HelperResult类。
存在和HtmlString @helper块中的所有字符串都不应该被编码。但我有以下场景(真实场景更复杂),其中html被编码
@helper Test(){
@(new HtmlString("<label>Test 1</label>"))
@(new HtmlString("<label>Test 2</label>"))
}
当我在浏览器中查看视图时,我看到字面上的<label> Test 1 ....
,因为在@helper测试中生成的Html代码在引号之间。
但是添加RawString然后它可以正常工作。
@helper Test(){
@(new RawString(new HtmlString("<label>Test 1</label>").ToString()))
@(new RawString(new HtmlString("<label>Test 2</label>").ToString()))
}
考虑到HtmlString是Razor没有编码字符串而@Helper返回HtmlString,我不明白为什么我需要添加RawString来正确渲染浏览器上的html代码。
这似乎是一个不正确的期望和/或解释的问题......
@helper
方法将其输出呈现为输出流,从而生成纯文本字符串。该字符串可能包含HTML,如果是这样,那么HTML可能会或可能不会被编码(取决于帮助程序的编写方式)。然后在IHtmlString
包装器对象内返回生成的纯文本字符串。
如果使用IHtmlString
渲染@(...)
对象,对Razor来说,这意味着“不要对此进行HTML编码,这已经在/当/需要时已经完成”。
简而言之,做@Test()
发送精确的字符串内容而无需进一步编码到浏览器(然后解释它)。如果你的目的是编码它,那么你可以使用@(Test().ToString())
,因为它将字符串拉出其IHtmlString
保护盖,然后它将是HTML编码。
如果你检查Test().ToString()
然后你可以看到纯文本内容,这对你的Test()
看起来像"<label>...</label><label>...</label>"
。您没有使用原始HtmlString对象的痕迹,它们都被渲染,并且没有任何HTML编码,因为您为每个对象使用了@(new HtmlString(...))
。
值得注意的是,这三个@helper
方法都具有完全相同的输出(除了某些空格):
@helper Test()
{
<label>Test</label>
}
@helper Test()
{
@(new HtmlString("<label>Test</label>"))
}
@helper Test()
{
@(Html.Raw("<label>Test</label>"))
}
所有这些的结果是包裹为"<label>Test</label>"
的普通字符串IHtmlString
。
最后,如果你想要<label>
进行HTML编码,那么这就是你需要使用的:
@helper Test()
{
@("<label>Test</label>")
}
结果是包裹为"<label>Test</label>"
的普通字符串IHtmlString
。