@Helper剃须刀,包含HTML

时间:2019-03-08 14:46:31

标签: asp.net-mvc razor

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

1 个答案:

答案 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>")
}

其结果是将纯字符串"&lt;label&gt;Test&lt;/label&gt;"包装为IHtmlString