Razor не розуміє незакриті теги html


99

За допомогою RazorViewEngine я можу це зробити:

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

але я не можу зробити це (бритви плутаються):

if (somecondition) {
    <div>
}

if (someothercondition) {
    </div>
}

У мене є ситуація, коли мені потрібно розміщувати свої теги на відкриття та закриття html в різні кодові блоки - як це зробити в Razor?

Відповіді:


161

Спробуйте так:

if (somecondition) {
    @:<div>
}

1
або <text><div></text>- haacked.com/archive/2011/01/06/…
Simon_Weaver

17
<text><div></text>працює, але <text></div></text>не робить.
фригл

@Stuntman Вам потрібно зробити це як для відкриття, так і для закриття тегів, щоб він працював.
Департамент Б

і як поводитися з багаторядковим текстом?
Дмитро Цой

Я не міг цього зробити в інлайнері. якщо (умова) {@: 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>"), тому що перший розділився на багаторядковий при використанні автоматичного форматування (ctrl + K ctrl + D)
Matteo Sganzetta

@MatteoSganzetta Істинно, якщо тільки те, що ви виводите, змінні Razor пересипали в нього, наприклад:@:<a href="@link" class="@classNames">@text</a>
qJake

Будьте обережні, використовуючи @Html.Raw()- дивіться пов’язані повідомлення SO
SliverNinja - MSFT

4

Ви можете створити нестандартний метод помічника MVC. Для цього ви створюєте публічний статичний клас 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
Моя ситуація така, що я хочу
sydneyos

Правильно, я вважаю, що у 99% випадків ви, мабуть, не повинні. Але ви можете вписатись у той 1%, і в такому випадку є @:або<text></text>
примхнути

7
Пізніше у нього є блок закриття:if (somecondition) { @:</div> }
Simon_Weaver

так, він повинен. моя думка полягає в тому, що такі погляди можна відновити, щоб такі подвійні умови не були необхідними.
marcind

1
@michielvoo Чому погано використовувати цей метод, наприклад, щоб мати умовну обгортку діва? Також у HTML5 ви не закриваєте <link>теги.
Кріс Хайнс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.