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>теги.
Крис Хейнс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.