当我在if子句中放入一个结束div标签时,Razor会抱怨

loy*_*low 15 c# asp.net-mvc razor

我试图使用Razor模板来做到这一点:

@if(isNew)
{
   <div class="new">
}

...


@if(isNew)
{
   </div>
}
Run Code Online (Sandbox Code Playgroud)

错误是:

cannot resolve the symbol 'div'
Run Code Online (Sandbox Code Playgroud)

Razor不喜欢IF子句中的结束div标签,我怎么能让它工作?我必须使用逃脱吗?

Ant*_*t P 40

当您将开始/结束标记分割为这样时,Razor不喜欢它,因为它无法正确解析HTML,因此您必须将它们作为纯文本转义:

@if(isNew)
{
   @:<div class="new">
}

...


@if(isNew)
{
   @:</div>
}    
Run Code Online (Sandbox Code Playgroud)

更传统的方法是重复div中的标记(使用partials或其他方式) - 我想说,哪种方法更可取,取决于条件div之间标记的性质:

@if(isNew)
{
    <div class="new">
        <!-- some markup or partial view -->
    </div>
}
else
{
    <!-- some markup or partial view -->
}
Run Code Online (Sandbox Code Playgroud)

如果有的话,我更喜欢这种方法:

  1. 包含的标记可以有用地包含在部分中,以便可以在其他地方重复使用.
  2. 条件包装标记超过几行,此时转义标记变得混乱.

我还应该添加使用辅助方法的选项:

@helper MainMarkup()
{
    <!-- some markup or partial view -->
}

@if(isNew)
{
    <div class="new">
        @MainMarkup()
    </div>
}
else
{
    @MainMarkup()
}
Run Code Online (Sandbox Code Playgroud)

如果要使用上面的第二个选项但是避免重复标记或嵌套太多的部分(特别是如果此标记仅与此视图相关),这将非常有用.

  • 这就是我的观点 - 如果中间有很多标记,您不希望它重复,并且将其抽象为部分可能没有语义意义(当然,取决于它是什么)。如果是这种情况,我宁愿只是转义容器,而不是重复内部标记或将其包装在部分标记中。 (2认同)