#c# #javascript #asp.net-mvc #asp.net-mvc-4 #razor
#c# #.net #asp.net #asp.net-mvc #razor
Вопрос:
Razor кодирует строку по умолчанию. Существует ли какой-либо специальный синтаксис для рендеринга без кодирования?
Ответ №1:
Поскольку ASP.NET MVC 3, вы можете использовать:
@Html.Raw(myString)
Комментарии:
1. Это не совсем правильно. Да, вы можете вставить необработанную строку, но если у вас есть
"'<>etc...
, они будут экранированы. Правильный способ — использовать MvcHtmlString, который допускает «недопустимые» символы. Например, если вы кодируете данные Json … без кодирования всей модели2. Дэниел, Html.Raw() «возвращает разметку, которая не закодирована в HTML».
3. Html.Raw() кодирует кавычки…
"myAttr='hello';myInt=10"
4. Он НЕ кодирует кавычки. Помимо очевидной документации, в которой указано, что это ясно как день ( «Этот метод переносит разметку HTML с использованием класса IHtmlString, который отображает некодированный HTML.» ), Я также протестировал это, и кавычки не кодируются.
Ответ №2:
@(new HtmlString(myString))
Ответ №3:
Как и уже упомянутый подход @Html.Raw(string), если вы выводите MvcHtmlString, он не будет закодирован. Это может быть полезно при добавлении собственных расширений в HtmlHelper или при возврате значения из вашей модели представления, которое, как вы знаете, может содержать html.
Например, если ваша модель представления была:
public class SampleViewModel
{
public string SampleString { get; set; }
public MvcHtmlString SampleHtmlString { get; set; }
}
Для Core 1.0 (и MVC 5 ) используйте HtmlString
public class SampleViewModel
{
public string SampleString { get; set; }
public HtmlString SampleHtmlString { get; set; }
}
затем
<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
Ответ №4:
Используйте @Html.Raw()
с осторожностью, так как вы можете вызвать больше проблем с кодированием и безопасностью. Я понимаю вариант использования, поскольку мне приходилось делать это самому, но осторожно… Просто избегайте пропускания всего текста. Например, только сохранять / преобразовывать определенные последовательности символов и всегда кодировать остальные:
@Html.Raw(Html.Encode(myString).Replace("n", "<br/>"))
Тогда у вас есть уверенность в том, что вы не создали потенциальную брешь в безопасности, и любые специальные / посторонние символы отображаются корректно во всех браузерах.
Комментарии:
1. 1 Именно то, что мне было нужно! Строка все еще должна быть закодирована, но возвращаемая строка должна быть html. Спасибо!
2.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("n"), "<br/>"))
для ASP.NET Ядро
Ответ №5:
В случае ActionLink обычно используется HttpUtility.Кодируйте текст ссылки. В этом случае вы можете использовать HttpUtility.HtmlDecode(myString)
, что это сработало для меня при использовании HtmlActionLink для декодирования строки, которую я хотел передать. например:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
Ответ №6:
Вы также можете использовать метод WriteLiteral