从MVC3升级到MVC4后,“元素未关闭”错误

时间:2012-10-02 16:58:35

标签: .net asp.net-mvc razor asp.net-mvc-4

Razor 2(与MVC4一起提供)似乎与Razor 1(来自MVC3)完全向后兼容。

自升级以来,我发现了一个错误:

  

“td@Html.Raw(count”元素未关闭。所有元素必须是自动关闭或具有匹配的结束标记。

造成这种情况的代码是:

<td@Html.Raw(count == null ? null : " class='has-item'")>

这是什么解决方案?

2 个答案:

答案 0 :(得分:14)

Razor解析器是为MVC 4重新编写的,presumably because

  

HTML5规范明确指出支持未封闭的HTML标记,但Razor v1没有足够先进的解析器来支持这一点。 Razor v2现在支持W3C规范中列出的元素。

这里最简单的解决方案是在@符号前添加一个空格:

<td @Html.Raw(count == null ? null : " class='has-item'")>

然而,使用MVC 4的Razor中的条件属性具有更优雅的语法。

<td class="@(count == null ? null : "has-item")">

当属性值解析为null时,该元素将省略该属性。所以这个标记的输出是:

<td>

...或...

<td class="has-item">

答案 1 :(得分:1)

MVC4的Razor解析器与MVC3不同。 Razor v3具有高级解析器功能,另一方面严格解析与MVC3相比。

如果您没有以正确的方式使用razor语法,则在将MVC3转换为MVC4时可能会在视图中遇到语法错误。

解决Razor v2中不允许的一些常见剃刀代码错误:

- &GT;除非有变量声明部分,否则请避免在视图中使用服务器块。

Don’t : @{if(check){body}}
Recommended : @if(check){body}

- &GT;当你已经在服务器范围内时,避免使用@。

Don’t : @if(@variable)
Recommended : @if(variable)

Don't : @{int a = @Model.Property }
Recommended : @{int a = Model.Property }