Razor View Engine: сложные циклы и HTML - PullRequest
28 голосов
/ 24 января 2011

У меня есть много сложных отчетов HTML в моем текущем проекте, где мы выполняем много условного рендеринга TR и TD с интервалами строк и прострелов.

Иногда это может выглядеть так (это очень упрощено):

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      <tr>                
   }
   <td></td>
   </tr>
}

Однако Razor утверждает: «В цикле foreach отсутствует закрывающий символ«} ».(в Visual Studio)

Я пытался обернуть <tr> в <text></text>, из-за чего проблема с закрытием} исчезла только для того, чтобы найти это при запуске: "Обнаружен конечный тег" tr "без соответствияначальный тег. Правильно ли сбалансированы ваши начальный / конечный теги? ".

Как бы я сделал этот вид условного рендеринга, убедив Razor вообще не беспокоиться о HTML, потому что HTML сбалансирован, когда все циклы выполняютсясделанный.Или, по крайней мере, так было при использовании ASP.NET View Engine.

Ответы [ 4 ]

35 голосов
/ 24 января 2011

Visual Studio Intellisense и подсветка синтаксиса не являются одними из лучших, но в этом случае они предупреждают вас о том, что если условие не выполняется, вы можете получить недопустимую разметку и не следует винить ее за это.

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

ИМХО иметь так много условной логики в представлении - это злоупотребление.Вам определенно следует рассмотреть возможность использования HTML-помощников или элементов управления, таких как MVCContrib Grid .


ОБНОВЛЕНИЕ:

Вы можете попробовать следующее:

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      @:<tr>                
   }
   @:<td></td>
   @:</tr>
}
6 голосов
/ 24 января 2011

Бритва зависит от соответствия тегов для определения автоматических переходов между кодом и разметкой.Вы не можете «отключить» эту функцию Razor (по крайней мере, без переписывания больших частей анализатора Razor).

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

@foreach (var ourItem in ourList) {
   <tr>
   <td>...</td>
   </tr>
}

Хотя теги могут скомпенсировать разметку в сгенерированной разметке, предоставленный вами источник сильно затрудняет оценку его правильности.

4 голосов
/ 04 февраля 2011

У меня была похожая проблема - мое решение Html.Raw ("");

    if (isTrue)
    {
        <text><div></text> }
   ...

    if(isTrue) {
        @Html.Raw("</div>"); // <-- closing tag!
        }
4 голосов
/ 25 января 2011

Когда вы пытаетесь использовать rowspan и пытаетесь получить структуру вроде

<table>
   <tr>
       <td rowspan=2>1:st col</td>
       <td>2:nd col</td>
   </tr>
   <tr>
       <td>2:nd col</td>
   </tr>
</table>

Вы можете попробовать:

@{ 
    var ourList = new List<string> { "1", "2", "3" };
}

<table border=1>
@foreach(var ourItem in ourList){
    <tr>
    @if (ourItem == ourList.First())
    {
        <td rowspan="@ourList.Count()">@ourItem</td>
    }
    <td>@ourItem</td>
    </tr>
}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...