正确使用@ Html.Raw()

时间:2015-04-08 20:58:55

标签: asp.net-mvc-4 razor model-view-controller

我正在尝试生成一个折叠面板的视图。我需要每个面板都有一个唯一的ID。我已成功完成以下代码。但在另一篇文章中警告说使用@ 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("\">")

2 个答案:

答案 0 :(得分:4)

您需要了解为什么 Html.Raw是一种所谓的“不良做法”。&#34;如果它普遍不好而且永远不应该被使用那么它就不会被创造出来。当它被用于将非消毒内容写入浏览器时会很糟糕,因为它使您容易受到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">
}

答案 1 :(得分:2)

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

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

More information