Razor HTML Условный вывод - PullRequest
       4

Razor HTML Условный вывод

8 голосов
/ 15 марта 2011

У меня есть список элементов, которые я хочу вывести в качестве содержимого основного (основное не включено ниже). Каждый элемент имеет 3 атрибута: имя раздела, метку и значение. Каждый элемент заключен в a, и каждый раз, когда меняется Имя раздела, мне нужно открыть (и закрыть предыдущий, если есть). Я использую вид Razor с этим кодом:

@foreach (LocalStorageItem lsi in Model) { 
    string fld_name = "f_" + lsi.ItemName;
    if (lsi.SectionName != sn) {
        if (sn != "") { 
            Html.Raw("</fieldset>"); 
        }
        sn = lsi.SectionName;
        <h2>@sn</h2>
        Html.Raw("<fieldset>");              
    }
        <div class="row">
            <div class="ls_label">@lsi.ItemName</div>
            <div class="ls_content" name="@fld_name" id="@fld_name">.</div>
        </div>        
 }
 @if (Model.Count != 0) {
    Html.Raw("</fieldset>");
 }

Проблема в том, что при каждом изменении имени раздела тег fieldset (открытый и / или закрытый) не создается. Где я не прав? Если я не использую Html.Raw (или @: в качестве альтернативы), анализатор VS2010 выдает ошибку.

Ответы [ 2 ]

14 голосов
/ 15 марта 2011

Вызов Html.Raw возвращает IHtmlString;он ничего не записывает на страницу.

Вместо этого вы должны написать

@:</fieldset>

Использование @: заставляет Razor обрабатывать его как обычный текст, поэтому ему не нужнобыть правильно сформированными.


Однако ваш код можно сделать намного чище, вызвав GroupBy и сделав вложенный цикл foreach.

8 голосов
/ 15 марта 2011

Я действительно думаю, что использование @: для обхода такого кода является злоупотреблением этой escape-последовательностью. Вместо этого следует решить проблему путем правильного рефакторинга кода, чтобы можно было легко написать сбалансированные теги:

@foreach(var section in Model.GroupBy(i => i.SectionName)) {
    <h2>@section.Key</h2>
    <fieldset>
    @foreach(LocalStorageItem lsi in section) {
        string fld_name = "f_" + lsi.ItemName;
        <div class="row">
            <div class="ls_label">@lsi.ItemName</div>
            <div class="ls_content" name="@fld_name" id="@fld_name">.</div>
        </div>
    }
    </fieldset>
}

12 строк кода вместо 18

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...