根据https://blog.cindypotvin.com/character-encodings-with-razor-helpers/和其他一些资源,@ Helper块返回一个实现IHtmlString的HelperResult类。
Being和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代码。
答案 0 :(得分:2)
这似乎是一个错误的期望和/或解释问题……
@helper
方法将其输出呈现到输出流,从而产生纯文本字符串。该字符串可能包含HTML,如果包含,则该HTML可能一直沿途经过HTML编码(取决于助手的编写方式)。然后将所得的纯文本字符串返回到IHtmlString
包装对象中。
如果使用IHtmlString
渲染了@(...)
对象,对于Razor来说,这意味着“不要对其进行HTML编码,如果/在需要时/在需要的地方已经完成了”。
简而言之,执行@Test()
会将确切的字符串内容发送到浏览器,而无需进一步编码(然后由浏览器解释)。如果您的 aim 是要对其进行编码,则可以使用@(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
。