在ASP.NET MVC 3中,是否有可能从数据库中显示原始HTML?

46

我在我的数据库中有一张表,其中一个属性是一个HTML页面(不包含html、head和body标签),我想把它放在我的视图中间——比如说,调用一个带参数的控制器方法,并返回一个视图,将这个HTML字符串作为模型传递。我搜索了一下(不算多,我承认),找到了下面的方法:

<%= System.Web.HttpUtility.HtmlDecode(yourEncodedHtmlFromYouDatabase) %>

这是在 stackoverflow 中找到的。当我尝试类似的Razor方法时,最终得到了这个结果:

@System.Web.HttpUtility.HtmlDecode("<h1>Test</h1>")

这就是我的想法,但实际并没有完全按照我计划的那样工作。


yourEncodedHtmlFromYouDatabase看起来是什么样子?我猜HTML <h1>Test</h1> 实际上会被编码成这样:&lt:h1&gt;Test&lt:/h1&gt; - Matt Ball
实际上,这更像是使用标签。我还没有准备好数据库,但这是我们计划要做的,所以我正在寻找选项。 - Bruno Machado - vargero
这是关于MVC2的问题:https://dev59.com/tUvSa4cB1Zd3GeqPgKqv - Michael Maddox
2个回答

96
你所需的只是:@Html.Raw(来自你数据库中被编码的html) 我假设在数据库中的HTML已经经过了适当的净化处理(或者至少来自可靠的来源),因为如果没有,你可能会暴露于跨站脚本攻击之下。
你的方法没能奏效的原因是:Razor默认情况下对输出进行HTML编码(每次使用@来显示内容)。而Html.Raw告诉Razor你信任这段HTML并希望将它原样显示(因为它已经是原始的HTML了)。

1
非常感谢。至于安全性,我相信没有这样的问题,因为我们将自己构建这个HTML。 - Bruno Machado - vargero

12

你也可以返回一个HTMLString,Razor会输出正确的格式,例如。

@Html.GetSomeHtml()

public static HtmlString GetSomeHtml()
{
    var Data = "abc<br/>123";
    return new HtmlString(Data);
}

这将允许您显示HTML


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接