【问题标题】:"Element not closed" error after upgrading from MVC3 to MVC4从 MVC3 升级到 MVC4 后出现“元素未关闭”错误
【发布时间】:2012-10-02 16:58:35
【问题描述】:

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

升级后发现错误:

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

造成这种情况的代码是:

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

解决办法是什么?

【问题讨论】:

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


    【解决方案1】:

    为 MVC 4 重写了 Razor 解析器,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">
    

    【讨论】:

      【解决方案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 }
      

      【讨论】:

        猜你喜欢
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 2013-09-07
        • 2020-01-19
        • 2014-10-06
        相关资源
        最近更新 更多