Вопрос по asp.net-mvc, asp.net – ASP.NET MVC Razor не примет мою действительную разметку

12

Мне очень нравится синтаксис 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> пометка перед открытием. Я могу жить с этим. Но когда я запускаю приложение, я на самом деле получаю следующую ошибку во время выполнения:

Encountered end tag "div" with no matching start tag. Are your start/end tags properly balanced?

Очевидно, я не могу с этим жить! Так есть ли хитрость для решения этого дела? Я знаю, что я делаю, насколько мне нужна разметка. Но Razor так не думает, и он вступает во владение.

И почему, черт возьми, MVC тратит циклы проверки на сбалансированные теги?

Я не знаю ... Я немного искал и обнаружил, что кто-то другой предложил тот же самый ответ. ? gdoron
@gdoron: тот же ответ, что и что? Jonathan Wood

Ваш Ответ

2   ответа
5

перед тегом (как указано в отмеченном ответе). Эта запись в блоге объясняет причину этого:

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

Из блога:

One of the techniques that Razor uses to implicitly identify when a code block ends is to look for tag/element content to denote the beginning of a content region.

а также

Not all content container blocks start with a tag element tag, though, and there are scenarios where the Razor parser can’t implicitly detect a content block.

Razor addresses this by enabling you to explicitly indicate the beginning of a line of content by using the @: character sequence within a code block. The @: sequence indicates that the line of content that follows should be treated as a content block:

11

@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 указывало на то, что он распознал теги, а не код.

Кроме того, почему это заставило ошибку исчезнуть? То, что вызвало ошибку во время выполнения, не изменилось. Возможно, кто-то может заполнить пробелы для меня.

Смотрите мой ответ на этот вопрос по причине, почему это работает.
Я тоже иногда путаюсь. :) Если это проблема Razor, то почему она генерирует ошибки во время выполнения. Это просто не имеет смысла для меня. Jonathan Wood
Я думаю, что синтаксис, который работает, на самом деле гораздо более читабелен, и, очевидно, Razor соглашается;) Razor иногда путается. Вот почему существуют такие escape-последовательности.
@RahulNikate: Да, в некоторых случаях Бритва немного запутывается. Jonathan Wood
@JonathanWood Спасибо за ответ. Но в Visual Studio Если я нажимаю Ctrl + K + D для выравнивания кода, он переформатирует его как @: (& lt; / div & gt; переходит к следующей строке). Так что вызывая снова ту же ошибку

Похожие вопросы