Подтвердить что ты не робот

ASP.NET MVC Razor не примет мою действительную разметку

Мне очень нравится синтаксис 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>
}

Итак, редактор дает мне squiggly строки, указывающие, что я заканчиваю тег <div> перед открытием. Я могу жить с этим. Но когда я запускаю приложение, я получаю следующую ошибку во время выполнения:

Обозначенный конечный тег "div" без соответствующего начального тега. Правильно ли сбалансированы ваши стартовые/конечные теги?

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

И почему heck - это цикл MVC для проверки сбалансированных тегов?

4b9b3361

Ответ 1

По причинам, которые я не понимаю, следующие исправили проблему:

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

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

Ответ 2

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

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

Из блога:

Один из методов, которые Razor использует, чтобы неявно идентифицировать, когда конец блока кода - это поиск содержимого тега/элемента для обозначения начало области содержимого.

и

Не все блоки контейнеров контента начинаются с тега элемента тега, и есть сценарии, в которых анализатор Razor canant неявно обнаруживает блок контента.

Бритва обращается к этому, позволяя вам явно указывать начало строки содержимого с использованием последовательности символов @: внутри кодового блока. Последовательность @: указывает, что строка следующий контент следует рассматривать как блок контента:

Ответ 3

Я нашел двойную кавычку плюс (") после определения класса div.

Пример:

                        |
                       \|/
   <div class="myclass" ">

   </div>