Razor 2(随 MVC4 提供)似乎并不完全向后兼容 Razor 1(来自 MVC3)。
升级后发现一个错误:
"td@Html.Raw(count" 元素未关闭。所有元素必须是自关闭的或具有匹配的结束标记。
导致这种情况的代码是:
<td@Html.Raw(count == null ? null : " class='has-item'")>
解决方案是什么?
Razor 2(随 MVC4 提供)似乎并不完全向后兼容 Razor 1(来自 MVC3)。
升级后发现一个错误:
"td@Html.Raw(count" 元素未关闭。所有元素必须是自关闭的或具有匹配的结束标记。
导致这种情况的代码是:
<td@Html.Raw(count == null ? null : " class='has-item'")>
解决方案是什么?
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">
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 }