2013-07-01 30 views
11

此代码,在Razor视图:如果有打开的`<table>`标签,Razor`if`不会注册关闭`}`?

if (true) 
{ 
    <table> 
     <tbody> 
} 

... 

if (true) 
{ 
     </tbody> 
    </table> 
} 

不运行。它声称第一个if()声明中没有关闭},我猜这是因为<table>标记。

有没有办法可以解决这个问题,有条件地插入我的<table>标签?

+1

如果在一个if语句中包含整个“

...
”,它会起作用吗?如果是这样,你应该改变你的代码,而不是。在哪种情况下,你想有条件地打印表头和页脚标签,但不是有条件地打印表内的内容?如果条件是错误的,你会不会最终得到随机的''和'​​'标签? – qJake

+0

我的代码块位于'foreach(){}'内,表格通过表值(表示实体类型)来分隔我的实体,而且我只希望每个类型都有一个表。 'if(){}'检查已更改的表类型(因为实体列表是按该类型排序的)。 – Kehlan

回答

27

尝试用前面加上标签@:

if (true) 
{ 
    @:<table> 
     @:<tbody> 
} 

... 

if (true) 
{ 
     @:</tbody> 
    @:</table> 
} 
+0

+1这实际上看起来比我的答案好。 – Fenton

+0

这绝对是最好的解决方案。谢谢! – Kehlan

+4

为什么剃须刀自动格式将结束标签放在一个新的线上? –

1

Razor确实希望匹配的结束标签默认处于语句内部。

您可以使用特殊<text>标签,以帮助剃刀出来:

@if (true) { 
    <text> 
    <table> 
     <tbody> 
    </text> 
} 
+1

剃刀仍然抱怨,因为它承认'

'和''是HTML标签,并且期望它们在标签关闭之前关闭。 – StriplingWarrior

+0

我使用VS2012,MVC4,它适用于我。你用同样的东西吗?无论如何,你仍然会收到关于结束标签的警告,这就是为什么我更喜欢D斯坦利的答案。 – Fenton

+0

是的,我想这并不妨碍Razor识别'}',但正如你所说,仍然有警告。 – StriplingWarrior

2

您可以将它作为字符串,那么他们不会解析为html和不符合语法地干扰:

@Html.Raw(true?"<table><tbody>":"") 

@Html.Raw(true?"</tbody></table>":"")