14

私は Razor の構文がとても気に入っていますが、完璧とは言えません。たとえば、次のマークアップ ブロックがあります。

@if (Model.FeaturedDestinations != null && Model.FeaturedDestinations.Count() > 0)
{
    int column = 0;

    foreach (var d in Model.FeaturedDestinations)
    {
        column++;
        if (column > 4)
        {
            </div>
            @{ column = 1; }
        }
        if (column == 1)
        {
            @:<div class="row-fluid">
        }
        <div class="span3">
            @RenderDestination(d)
        </div>
    }
    </div>
}

<div>そのため、エディターは、開始タグの前に終了タグがあることを示す波線を表示します。私はそれで暮らすことができます。しかし、アプリを実行すると、実際には次の実行時エラーが発生します。

一致する開始タグのない終了タグ「div」が見つかりました。開始タグと終了タグのバランスは適切ですか?

明らかに、私はそれと一緒に暮らすことはできません!では、この場合に対処するためのトリックはありますか? 必要なマークアップに関する限り、自分が何をしているかを知っています。しかし、Razor はそうは考えておらず、引き継いでいます。

そして、MVC がバランスの取れたタグをチェックするサイクルを浪費しているのはなぜですか?

4

2 に答える 2

13

理由がわからないため、次の問題が修正されました。

@if (Model.FeaturedDestinations != null && Model.FeaturedDestinations.Count() > 0)
{
    int column = 0;

    foreach (var d in Model.FeaturedDestinations)
    {
        column++;

        if (column > 4)
        {
            @:</div>
            column = 1;
        }

        if (column == 1)
        {
            @:<div class="row-fluid">
        }
        <div class="span3">
            @RenderDestination(d)
        </div>
    }
    @:</div>
}

@:いくつかのタグの前に追加されていることに注意してください。これらが必要な理由はわかりません。Razorの強調表示は、これらがコードではなくタグであると認識したことを示しています。

また、なぜこれでエラーが解消されたのですか?実行時エラーの原因は変わっていません。おそらく誰かが私のために空欄を埋めることができます。

于 2012-05-16T00:13:32.663 に答える
7

タグの前に @: を追加する必要があります (マークされた回答で識別されます)。このブログエントリはその理由を説明しています:

http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx

ブログから:

Razor がコード ブロックの終了を暗黙的に識別するために使用する手法の 1 つは、コンテンツ領域の開始を示すタグ/要素コンテンツを探すことです。

ただし、すべてのコンテンツ コンテナー ブロックがタグ要素タグで始まるわけではなく、Razor パーサーがコンテンツ ブロックを暗黙的に検出できないシナリオがあります。

Razor では、コード ブロック内で @: 文字シーケンスを使用して、コンテンツ行の開始を明示的に示すことができるようにすることで、この問題に対処しています。@: シーケンスは、後続のコンテンツ行をコンテンツ ブロックとして扱う必要があることを示します。

于 2013-02-25T14:29:39.477 に答える