Razor не понимает незакрытые теги HTML

100

С RazorViewEngine я могу сделать это:

if (somecondition) {
     <div> some stuff </div>
}

но я не могу этого сделать (Razor путается):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

У меня есть ситуация, когда мне нужно поместить свои открывающие и закрывающие html-теги в разные блоки кода - как я могу сделать это в Razor?

Сидней
источник

Ответы:

162

Попробуйте вот так:

if (somecondition) {
    @:<div>
}
Дарин Димитров
источник
1
или <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver
17
<text><div></text>работает, но <text></div></text>не работает.
friggle 08
@Stuntman, вам нужно сделать это как для открывающего, так и для закрывающего тега, чтобы он работал.
Departamento B
а как разобраться с многострочным текстом?
Дмитрий Цой
Я не мог сделать это встроенным. if (условие) {@: tag}. Пришлось отформатировать, как указано выше.
Майк
59

Чтобы объяснить ответ Дарина, то есть префикс HTML следующим образом:

@:<html>

@: в Razor означает «визуализировать что-либо как простой текст»

или вы можете использовать это, которое выводит HTML в том виде, в каком вы его изначально написали (это также можно использовать, чтобы избежать автоматической кодировки HTML, которую делает Razor, если вы пытаетесь вывести HTML):

@Html.Raw("<html>")

(Ссылка Html.Raw из MS - http://msdn.microsoft.com/en-us/library/gg568896(v=vs.111).aspx )

Крис Хэлкроу
источник
2
решения прекрасны, но объяснения бесценны. Спасибо!
Джей
2
Я предпочитаю решение @ Html.Raw ("<html>"), потому что первое было разделено на несколько
строк
@MatteoSganzetta True, если то, что вы выводите, не содержит переменных Razor, например:@:<a href="@link" class="@classNames">@text</a>
qJake
Будьте осторожны при использовании @Html.Raw()- см. Соответствующий пост SO
SliverNinja - MSFT
4

Вы можете создать собственный метод MVC Helper. Для этого вы создаете общедоступный статический класс MyRenderHelpers в пространстве имен System.Web.Mvc.Htmlи напишите метод Html.

namespace System.Web.Mvc.Html
{
    public static class MyRenderHelpers
    {
        public static MvcHtmlString Html(this HtmlHelper helper, string html, bool condition)
        {
            if (condition)
                return MvcHtmlString.Create(html);
            else
                return MvcHtmlString.Empty;
        }
    }
}

Теперь вы можете использовать этот метод расширения в своем представлении бритвы:

@Html.Html("<div>", somecondition)
Томас Хаузер
источник
3

Тот факт, что вам нужно это сделать, обычно указывает на то, что код вашего представления неправильно разложен. Природа HTML состоит в том, чтобы иметь сбалансированные или замкнутые теги (по крайней мере, в HTML 4, HTML 5, похоже, отходит от него), и Razor зависит от этого предположения. Если вы собираетесь выдавать условно, <div>то вы также будете где-то позже вывести </div>. Просто укажите целую пару в своем ifзаявлении:

@if(something) {
    <div>
        Other stuff
    </div>
}

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

Марсинд
источник
6
Моя ситуация такова, что я хочу
Сидней
Верно, я считаю, что в 99% случаев вы, вероятно, не должны. Но вы можете вписаться в этот 1%, и в этом случае будет @:или<text></text>
марсинд
7
у него наверняка есть закрывающий блок позже:if (somecondition) { @:</div> }
Simon_Weaver
да, он должен. Я хочу сказать, что такие представления можно реорганизовать, чтобы в таких двойных условных выражениях не было необходимости.
Marcind
1
@michielvoo Почему плохо использовать этот метод, например, для условной оболочки div? Также в HTML5 вы не закрываете <link>теги.
Крис Хейнс