Отключить кодировку HTML в Razor

У меня есть функция, которая возвращает фрагмент JavaScript и/или HTML.

static public string SpeakEvil()
{
    return "<script>alert('BLAH!!');</script>";
}

С точки зрения Razor, как и следовало ожидать, Razor совершенно правильно кодирует его в HTML.

@StaticFunctions.SpeakEvil()

Как сделать так, чтобы Razor не кодировал HTML, чтобы HTML и JavaScript выдавались дословно и чтобы любой скрипт действительно выполнялся?


person Damien Sawyer    schedule 11.02.2011    source источник


Ответы (3)


Вы можете использовать функцию Raw(), но в основном она предназначена для вещей, поступающих из базы данных.

Для такого помощника, как у вас, я бы предложил вернуть IHtmlString:

static public IHtmlString SpeakEvil() {
    return new HtmlString("<script>alert('BLAH!!');</script>");
}

Таким образом, вам не нужно звонить Raw() на каждый телефонный узел.

person marcind    schedule 11.02.2011
comment
Я использую RazorEngine в не-веб-приложении. Ни одно из предложенных вами решений не работает для меня, фактически вызов метода Html.Raw дает мне следующее исключение: Невозможно скомпилировать шаблон. Имя «Html» не существует в текущем контексте. Если у меня есть MvcHtmlString или IHtmlString, он по-прежнему html кодирует текст, но не генерирует исключение. - person Ben Lesh; 17.01.2012
comment
Я использую RazorEngine вне веб-приложения и не могу заставить его работать :( Есть идеи? - person leypascua; 31.03.2012
comment
@blesh & leypascua stackoverflow.com/questions/15273327/ Если вы используете RazorEngine, это рассматривается в этом соответствующем вопросе: stackoverflow.com/questions/15273327/ - person Ergwun; 14.05.2014

Используйте помощник Html.Raw.

@Html.Raw(StaticFunctions.SpeakEvil())
person Oded    schedule 11.02.2011

Верните MvcHtmlString (наследуется от HtmlString), вызвав метод MvcHtmlString.Create() следующим образом:

public static MvcHtmlString SpeakEvil()
{
    return MvcHtmlString.Create("<script>alert('BLAH!!');</script>");
}


Вы также можете сделать его расширением String:

public static MvcHtmlString HtmlSafe(this string content)
{
    return MvcHtmlString.Create(content);
}


Источник:
http://geekswithblogs.net/shaunxu/archive/2010/04/10/lt-gt-htmlencode-ihtmlstring-and-mvchtmlstring.aspx

person Nikkelmann    schedule 30.10.2011
comment
Придирка, но когда я вижу метод, начинающийся с Is, я предполагаю, что метод отвечает на вопрос. то есть IsDecimal(0m) => true - person Samantha Branham; 20.03.2012
comment
Исправлено :) IsHtmlSafe -> HtmlSafe - person Nikkelmann; 21.03.2012