Я передаю анонимный тип в динамическое частичное представление как часть @model
, а одно из свойств - это строка, содержащая некоторый HTML. Когда я использую методы HtmlHelper
для рендеринга этого свойства, механизм Razor кодирует строку, в результате чего в этом случае вместо символа text
создается буквальный текст на странице - <i>text</i>
.
Поскольку это динамически типизированный вид, я не могу напрямую вызвать это свойство. В частности, если я пытаюсь привязать к @Model.MyField
, я получаю a RuntimeBindingException
:
'object' does not contain a definition for 'MyField'
В идеале я мог бы создать тип (или, по крайней мере, интерфейс) для указания для представления (который я рекомендую в качестве оптимального решения), но мой объем работы не позволяет этого. Кроме того, я использую Partial View
в первую очередь, чтобы я мог перерабатывать шаблон для разных типов, которые имеют одинаковые имена свойств, но не для тех же типов (yay legacy code!).
Я рассмотрел несколько связанных вопросов, которые затрагивают аналогичные проблемы, но ответы не работают для моей конкретной ситуации (из-за необходимости анонимного типа, переданного моему представлению @model dynamic
)).
-
Отображение HTML-строки из модели в представлении MVC Razor
- Перечисляет несколько неудачных подходов, останавливается при создании
IHtmlString
через@(new HtmlString(stringWithMarkup))
илиMvcHtmlString.Create(stringWithMarkup)
- Оба из них требуют известного типа или локальной переменной и не работают для привязки свойства анонимного
object
- Перечисляет несколько неудачных подходов, останавливается при создании
-
ASP.NET MVC4 - отображает HTML, содержащий строку как необработанный HTML
- Принятый ответ помогает объяснить, что происходит:
Все выходные данные из помощников и других элементов в Razor передаются через HttpUtility.HtmlEncode, если они не реализуют
IHtmlString
.
- Принятый ответ помогает объяснить, что происходит:
Попытки решения
-
Хорошо, поэтому я предполагаю, что я просто поменяю свойства
String
на один из этих свойствIHtmlString
... nope. Поскольку у меня есть анонимный тип, движок Razor не знает, чтоMyField
являетсяIHtmlString
и (я предполагаю) вызывает.ToString()
, который затем кодируется как обычно. -
Хорошо, может быть,
@Html.DisplayFor
умнее? Да, но доступ запрещен:'System.Web.Mvc.HtmlHelper' не имеет применимого метода с именем "DisplayFor", но по этому имени имеет метод расширения. Методы расширения не могут динамически отправляться. Подумайте о том, как использовать динамические аргументы или вызывать метод расширения без синтаксиса метода расширения.
О, верно. Динамически отправляется - я не могу называть методы расширения анонимными методами, потому что Razor не знает, что это такое. Потому что я использую
@model dynamic
, чтобы явным образом сказать это, стиль джедая: "Вам не нужно видеть его идентификацию". Если бы я всегда знал, какой именно тип, то да, я мог бы наложить объект или вызвать метод расширения без использования синтаксиса, но опять же,dynamic
иanonymous
. Вид курицы и яиц здесь.