Asp.net mvc 4 @Html.Raw()的正确用法

Asp.net mvc 4 @Html.Raw()的正确用法,asp.net-mvc-4,razor,model-view-controller,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

我试图生成一个视图,其中包含正在折叠的面板。我需要每个面板都有一个唯一的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("\">")
@Html.Raw(“item.NAME”)@Html.Raw(\“class=\”面板折叠\“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>


关于Razor语法。

您可以通过组合文本、标记和Razor代码来简化代码。 在您的情况下,将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>


关于Razor语法。

你需要理解为什么
Html。Raw
是一种所谓的“坏习惯”。如果它是普遍的坏习惯,永远不应该被使用,那么它一开始就不会被创建。当它用于将未经清理的内容写入浏览器时,这是不好的,因为它使您容易受到XSS攻击

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

话虽如此,似乎您可以通过在模型中传递一组
div
s来创建并循环它们来简化事情,如下所示,这可能需要一些调整才能使其正确

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

您需要理解为什么
Html。原始
是一种所谓的“坏习惯”。如果它普遍不好,并且永远不应该被使用,那么它本来就不会被创建。当它被用于将未经消毒的内容写入浏览器时是不好的,因为它使您容易受到XSS攻击

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

话虽如此,似乎您可以通过在模型中传递一组
div
s来创建并循环它们来简化事情,如下所示,这可能需要一些调整才能使其正确

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

这就是我想弄明白的。如果它很糟糕,为什么会在那里。谢谢你的澄清。这就是我想弄明白的。如果它很糟糕,为什么会在那里。谢谢你的澄清。谢谢!这帮了大忙。使编码更干净。谢谢!这帮了大忙。使编码更干净。