编写/输出未转义的HTML字符串

时间:2010-11-25 23:05:58

标签: asp.net-mvc asp.net-mvc-3 razor

我已经在数据库表中保存了安全/清理的HTML。

如何在Razor视图中写出此HTML内容?

它总是将<和&符号等字符转义为&amp;

7 个答案:

答案 0 :(得分:627)

假设您的内容位于名为mystring ...

的字符串中

您可以使用:

@Html.Raw(mystring)

或者,您可以将字符串转换为HtmlString或在模型中实现IHtmlString或直接内联的任何其他类型,并使用常规@

@{ var myHtmlString = new HtmlString(mystring);}
@myHtmlString

答案 1 :(得分:75)

在ASP.NET MVC 3中你应该这样做:

// Say you have a bit of HTML like this in your controller:
ViewBag.Stuff = "<li>Menu</li>"
//  Then you can do this in your view:
@MvcHtmlString.Create(ViewBag.Stuff)

答案 2 :(得分:58)

您可以使用

@{ WriteLiteral("html string"); }

答案 3 :(得分:11)

有时使用原始html可能会很棘手。主要是因为XSS漏洞。如果这是一个问题,但你仍然想使用原始html,你可以编码可怕的部分。

@Html.Raw("(<b>" + Html.Encode("<script>console.log('insert')</script>" + "Hello") + "</b>)")

结果

(<b>&lt;script&gt;console.log('insert')&lt;/script&gt;Hello</b>)

答案 4 :(得分:4)

您可以将字符串放入控制器中的viewdata,如下所示:

 ViewData["string"] = DBstring;

然后在视图中调用viewdata:

@Html.Raw(ViewData["string"].ToString())

答案 5 :(得分:2)

除了使用@MvcHtmlString.Create(ViewBag.Stuff)  正如Dommer建议的那样,我建议你也使用AntiXSS库作为建议phill http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx

它几乎编码了所有可能的XSS攻击字符串。

答案 6 :(得分:0)

在RazorEngine中使用模板函数的完整示例(例如,用于生成电子邮件):

@model SomeModel
@{
    Func<PropertyChangeInfo, object> PropInfo =
        @<tr class="property">
            <td>
                @item.PropertyName                
            </td>
            <td class="value">
                <small class="old">@item.OldValue</small>
                <small class="new">@item.CurrentValue</small>                
            </td>
        </tr>;
}

<body>

@{ WriteLiteral(PropInfo(new PropertyChangeInfo("p1", @Model.Id, 2)).ToString()); }

</body>