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 の仕様にリストされている要素でこれをサポートするようになりました。

ここでの最も簡単な解決策は、@記号の前にスペースを 1 つ追加することです。

<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 に答える