6

Razor 2(随 MVC4 提供)似乎并不完全向后兼容 Razor 1(来自 MVC3)。

升级后发现一个错误:

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

导致这种情况的代码是:

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

解决方案是什么?

4

2 回答 2

14

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">
于 2012-10-02T16:58:35.150 回答
2

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

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

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

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

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 }
于 2013-04-08T12:22:16.417 回答