Razor кодирует строку по умолчанию. Есть ли специальный синтаксис для рендеринга без кодирования?
Razor кодирует строку по умолчанию. Есть ли специальный синтаксис для рендеринга без кодирования?
Ответы:
Начиная с ASP.NET MVC 3, вы можете использовать:
@Html.Raw(myString)
"myAttr='hello';myInt=10"
@(new HtmlString(myString))
Как и уже упоминавшийся подход @ 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>
Используйте @Html.Raw()
с осторожностью, так как это может вызвать больше проблем с кодированием и безопасностью. Я понимаю вариант использования, так как я должен был сделать это сам, но осторожно ... Просто избегайте пропуска всего текста. Например, сохраняйте / конвертируйте только определенные последовательности символов и всегда кодируйте остальные:
@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))
Тогда вы будете уверены, что не создали потенциальную дыру в безопасности, и любые специальные / иностранные символы отображаются корректно во всех браузерах.
@Html.Raw(Html.Encode(myString).Replace(Html.Encode("\n"), "<br/>"))
для ASP.NET Core
В случае ActionLink он обычно использует HttpUtility.Encode в тексте ссылки. В этом случае вы можете использовать
HttpUtility.HtmlDecode(myString)
его для меня, когда используете HtmlActionLink для декодирования строки, которую я хотел передать. например:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
Вы также можете использовать метод WriteLiteral
"'<>etc...
она будет экранирована. Правильный способ - использовать MvcHtmlString, который разрешит «недопустимые» символы. Например, если вы кодируете данные Json ... без кодирования всей модели