ASP.NET Рендеринг MVC Razor без кодирования

#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