Я передаю анонимный тип в динамическое частичное представление как часть @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. Вид курицы и яиц здесь.
