正确使用@Html.Raw()

Correct use of @Html.Raw()

我正在尝试生成一个包含折叠面板的视图。我需要每个面板都有一个唯一的 ID。我已经使用下面的代码成功完成了。但在另一个 post 中被警告说使用 @Html.Raw() 是不好的做法。 我的选择是什么?

 @Html.Raw("<div id=\"collapse")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\" class=\"panel-collapse collapse collapse\" role=\"tabpanel\" aria-labelledby=\"heading")@Html.DisplayFor(modelitem => item.NAME)@Html.Raw("\">")

您可以通过组合文本、标记和剃须刀代码来简化您的代码。 在您的情况下,将 HTML 与内联 Razor 表达式一起使用:

<div id="@("collapse" + Html.DisplayFor(modelitem => item.NAME))" class="panel-collapse collapse collapse" role="tabpanel" aria-labelledby="@("heading" + Html.DisplayFor(modelitem => item.NAME))"></div>

More information 关于 Razor 语法。

你需要明白为什么 Html.Raw 是所谓的 "bad practice." 如果它普遍不好并且永远不应该使用那么它就不会已经首先创建。当它用于将未净化的内容写入浏览器时,这很糟糕,因为它会使您容易受到 XSS 攻击。

了解了这一点后,我们可以看看您在做什么,并发现您在调用 Html.Raw 时没有写出任何用户提供的数据,因此在这种情况下,这可能是一种可以接受的用法.

话虽如此,您似乎可以通过传递 div 的集合来简化事情以在您的模型中创建并循环遍历它们,如下所示,这可能需要一些调整才能获得刚刚好。

@foreach(var panelName in model.PanelNames)
{
    <div id="collapse@panelName
        class="panel-collapse collapse collapse" 
        role="tabpanel" 
        aria-labelledby="heading@panelName">
}