Отображать строку как html в представлении asp.net mvc

100

У меня есть контроллер, который генерирует строку, содержащую html-разметку. Теперь, когда я показываю ее в представлениях, она отображается как простая строка, содержащая все теги. Я попытался использовать помощник Html для кодирования / декодирования, чтобы отобразить его правильно, но он не работает.

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

На мой взгляд,

@Html.Encode(str)
Мукеш Шарма
источник
6
Думаю, Html.Rawдолжно помочь.
Saeed Neamati
1
Также я думаю, что вы можете использовать HtmlStrinкласс, как вHtmlString str = new HtmlString("<span>Some HTML here</span>");
Саид Нямати

Ответы:

173

Вы близки, вы хотите использовать @Html.Raw(str)

@Html.Encodeпринимает строки и обеспечивает правильную обработку всех специальных символов. К ним относятся такие символы, как пробелы.

Джаред
источник
6
@ Html.Raw - это именно то, что я искал, спасибо за ответ :)
AFract
IHtmlString, как упоминал @Jerad Rose, намного лучше
Pratyush Dhanuka
38

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

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

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

@Html.Raw(str)

По сравнению с:

@str

Кроме того, я также думаю, что это немного безопаснее по сравнению с использованием @Html.Raw(), так как вопрос о том, являются ли ваши данные HTML, хранится в вашем контроллере. В среде, где у вас есть фронтенд-разработчики или бэкэнд-разработчики, ваши внутренние разработчики могут быть более осведомлены о том, какие данные могут содержать значения HTML, таким образом сохраняя эту проблему в серверной части (контроллере).

Обычно я стараюсь по возможности избегать использования Html.Raw().

Еще одна вещь, на которую стоит обратить внимание: я не уверен, куда вы назначаете str, но несколько вещей, которые беспокоят меня в том, как вы можете это реализовать.

Во-первых, это нужно делать в контроллере, независимо от вашего решения ( IHtmlStringили Html.Raw). С вашей точки зрения, вам следует избегать любой подобной логики, поскольку на самом деле она здесь неуместна.

Кроме того, вы должны использовать ваш ViewModelдля получения значений в вашем представлении (и, опять же, в идеале IHtmlStringв качестве типа свойства). Увидеть что-то вроде @Html.Encode(str)этого немного беспокоит, если только вы не делали это только для упрощения своего примера.

Джерад Роуз
источник
1
Хочу отметить, что контроллеры предназначены для маршрутизации, а не для хранения данных. Кроме того, ваши серверные разработчики должны знать лучше, чем когда-либо изменять существующий контракт кода. Пользовательский интерфейс должен быть привязан к модели, и если модель сильно изменится, ваши модульные тесты должны сломаться.
Энтони Мейсон
Спасибо за Ваш ответ. Мне это нравится.
Thomas.Benz
Да, этот ответ намного лучше, я изначально использовал Html.Raw, но когда я прочитал этот ответ, я сразу переключился
Пратюш Дханука
7

ты можешь использовать @Html.Raw(str)

См. MSDN для получения дополнительной информации

Возвращает разметку, не закодированную в HTML.

Этот метод обертывает разметку HTML с помощью класса IHtmlString, который отображает незашифрованный HTML.

AthibaN
источник
1

У меня была аналогичная проблема с полями ввода HTML в MVC. На веб-странице отображалось только первое ключевое слово поля. Пример: поле ввода: «Быстрая коричневая лиса» Отображаемое значение: «The»

Решением было заключить переменную в кавычки в операторе значения следующим образом:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
Роланд Уэльс
источник
0

Недавно у меня была аналогичная проблема , и Google высадил меня сюда, поэтому я помещаю этот ответ здесь на случай, если и другие приземлятся здесь, для полноты.

Я заметил , что когда я плохо отформатированный HTML , я был на самом деле имея все мои HTML - теги раздели с только несоответствующим содержимым тега остальным . В частности, у меня была таблица с отсутствующим открывающим тегом таблицы, а затем все мои теги html из всей строки были полностью вырваны.

Итак, если вышеперечисленное не работает, и вы все еще чешете в голове, то также проверьте свой html на валидность.

Я заметил, что даже после того, как он заработал, MVC добавлял теги tbody там, где их не было. Это говорит мне, что происходит очистка (MVC 5), и что, когда этого не может произойти, он удаляет все / некоторые теги.

Грег
источник