@Helper razor编码html

问题描述 投票:0回答:1

根据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代码。

asp.net-mvc razor
1个回答
2
投票

这似乎是一个不正确的期望和/或解释的问题......

@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>")
}

结果是包裹为"&lt;label&gt;Test&lt;/label&gt;"的普通字符串IHtmlString

© www.soinside.com 2019 - 2024. All rights reserved.