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

6

Razor 2(随MVC4一起发布)似乎与Razor 1(来自MVC3)不完全向后兼容。

升级后,我发现了一个错误:

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

导致此问题的代码如下:

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

这个问题有什么解决办法?
2个回答

15
Razor解析器在MVC 4中进行了重写,可能是因为

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">

2

MVC4的Razor解析器与MVC3不同。 Razor v3具有先进的解析功能,同时相对于MVC3来说解析更加严格。

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

一些常见的Razor代码错误解决方案,这些错误在Razor v2中是不被允许的:

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

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

--> 当您已经在服务器范围内时,请避免使用@。
Don’t : @if(@variable)
Recommended : @if(variable)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接