6

ASP.NET MVC 3 を使用して RSS フィードの XML をレンダリングするビュー (.cshtml) があり、正常に動作しました。Razor 2 で ASP.NET MVC 4 にアップグレードしたので、以下のようなコンパイル エラーが発生します。

Parser Error

Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.

Parser Error Message: Encountered end tag "item" with no matching start tag.  Are your start/end tags properly balanced?

タグは適切にバランスが取れています。

誰にも考えはありますか?

更新: @foreach (...) { ... } ブロック内のitem要素内のlink要素に分離しました。

@foreach (var item in Model.Items)
{
<item>
    <title>@item.Title</title>
    <link>@item.Link</link>
    <description>@item.Description</description>
    <guid>@item.Guid</guid>
    @if (item.PublishedDateUtc.HasValue)
    {
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate>
    }  
</item>      
}

以下の@Html.Rawを使用して修正しました。

@foreach (var item in Model.Items)
{
<item>
    <title>@item.Title</title>
    @Html.Raw(string.Format("<link>{0}</link>", item.Link.ToHtmlEncoded()))
    <description>@item.Description</description>
    <guid>@item.Guid</guid>
    @if (item.PublishedDateUtc.HasValue)
    {
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate>
    }  
</item>      
}

誰にもより良い提案がありますか?明らかに、クラスを使用してモデルを宣言し、XML をコントローラーから直接返すこともできますが、この動作が発生する理由と、Razor 構文によりよく準拠するために何ができるかについて、もっと興味があります。

4

1 に答える 1

9

linkこれを最初に見たとき、あなたのタグには自己終了タグではなく終了タグがあることに気付きました。Razor はhtml を認識できるほどスマートで、リンク タグがどのように閉じられるかを認識しています。これは、Razor がどのように html を読み取るかを示すために壊れる可能性のある別の例です。

....
<tbody>
    @if (alternating) {
        <tr class='alternating'>
    } else {
        <tr>
    }

    ....

        </tr>
</tbody>

</tr>開始タグのない a が表示されるため、これは失敗します。

常にセルフ クロージングのタグは、Razor によってセルフ クロージングと解釈されます。あなたのlinkタグは実際には>. ( のない自己終了タグを持つことは有効な html であるため/>) したがって、それを正当化する開始タグのない終了タグに遭遇したため、パーサーはあきらめて、適切にフォーマットされていないと言います。いくつかのチェックを行う必要がありますが、適切なバランスが得られるため、終了linkタグがタグ用であると想定していると確信しています。鬼ごっこ。itemitem

前の終了タグが正しいものではなかったことを知るのに十分賢いはずです。チームで取り上げるのは問題かもしれません。

私はそれを試していませんが、あなたはこれを行うことができるはずです

@foreach (var item in Model.Items)
{
<item>
    <title>@item.Title</title>
    @:<link>
        @item.Link
    @:</link>
    <description>@item.Description</description>
    <guid>@item.Guid</guid>
    @if (item.PublishedDateUtc.HasValue)
    {
    <pubDate>@item.PublishedDateUtc.Value.ToString("ddd, dd MMM yyyy HH:mm:ss") GMT</pubDate>
    }  
</item>      
}
于 2012-06-07T15:42:29.027 に答える