Ошибка синтаксического анализа в частичном представлении Umbraco 7: отсутствует закрывающая фигурная скобка, несмотря на наличие всех пар фигурных скобок

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

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