Грешка при анализиране в частичен изглед на Umbraco 7: липсваща затваряща скоба въпреки наличието на всички двойки скоби

В момента работя върху опитите си да се справя с Umbraco и използването на Razor, но намирам вградения характер на кода на Razor за особено труден. По някаква причина, когато компилирам моя частичен изглед по-долу (който извежда Bootstrap carousel на екрана на страницата, в която е извикан), получавам следната грешка при компилиране:

Line 3:  @if (Model.Content.HasValue("bannerImages")){  
Parser Error Message: The if block is missing a closing "}" character.  Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup.

Въпреки това проверих всичките си тагове в Notepad++ (тъй като това е по-добро за идентифициране на съвпадащи тагове от Visual Studio) и всички скоби в документа ми се свързват, така че това ме кара да вярвам, че може да прилагам някои от вградените Razor кодът блокира неправилно. Някакви идеи?

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@if (Model.Content.HasValue("bannerImages")){   
    var bannerImagesList = Model.Content.GetPropertyValue<string>("bannerImages").Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse);
    var bannerImagesCollection = Umbraco.TypedMedia(bannerImagesList).Where(x => x != null);
    var imageCount = 0;

    <div id="carousel" class="carousel slide" data-ride="carousel">
      <!-- Indicators -->
      <ol class="carousel-indicators">
        <li data-target="#carousel" data-slide-to="0" class="active"></li>
        <li data-target="#carousel" data-slide-to="1"></li>
        <li data-target="#carousel" data-slide-to="2"></li>
        <li data-target="#carousel" data-slide-to="3"></li>
      </ol>

      <!-- Wrapper for slides -->
      <div class="carousel-inner">
        @foreach (var bannerImage in bannerImagesCollection){
            if (@imageCount < 1){
                <div class="item active">
            }else{
                <div class="item">
            }
                    <img src="@bannerImage.Url" alt="@bannerImage.Id" />
                </div>
        }
      </div>
    </div>  
}

person jezzipin    schedule 11.04.2014    source източник


Отговори (1)


Вашият проблем е в секцията foreach на кода. Вашият div трябва да бъде ограден вътре в операторите if и else.

Така че сменете своя foreach:

@foreach (var bannerImage in bannerImagesCollection)
{
    if (@imageCount < 1){
        <div class="item active">
    }else{
        <div class="item">
    }
        <img src="@bannerImage.Url" alt="@bannerImage.Id" />
        </div>
    }
}

С този и ще работи:

@foreach (var bannerImage in bannerImagesCollection)
{
    var cssClass = imageCount < 1 ? "item active" : "item";

    <div class="@cssClass">
        <img src="@bannerImage.Url" alt="@bannerImage.Id" />
    </div>
}

Редактиране (с помощта на if else)

@foreach (var bannerImage in bannerImagesCollection)
{
    if (imageCount < 1)
    {
        <div class="item active">
            <img src="@bannerImage.Url" alt="@bannerImage.Id" />
        </div>
    }
    else
    {
        <div class="item">
            <img src="@bannerImage.Url" alt="@bannerImage.Id" />
        </div>
    }
}
person Davor Zlotrg    schedule 11.04.2014
comment
Моят код обаче беше затворен в оператори if и else. Вашият използва троични оператори. - person jezzipin; 11.04.2014
comment
Освен това, когато заменя кода с предоставения от вас блок, сега получавам следната грешка: System.FormatException: valueDictionary не е форматиран правилно и липсва някой от елементите „id,nodeId,__NodeId“ (var cssClass = imageCount ‹ 1 ? артикул активен: артикул;) - person jezzipin; 11.04.2014
comment
В крайна сметка вашето решение, използващо троичния оператор, е по-сбито и следователно по-добро в този случай, но все още не разбирам защо се представя тази грешка в valueDictionary. - person jezzipin; 11.04.2014
comment
Преди сте имали грешка при компилиране, сега имате грешка по време на изпълнение и тя е свързана с функцията Umbraco.TypedMedia(). our.umbraco.org/ форум/разработчици/api-въпроси/. Опитайте да отидете в папката App_Data/Temp/ExamineIndexes и да изтриете всички файлове от папките Index там и това трябва да го поправи. - person Davor Zlotrg; 11.04.2014