始终使用MVC3和Razor输出原始HTML

本文关键字:Razor 输出 原始 HTML MVC3 | 更新日期: 2023-09-27 17:58:20

我有一个类的属性如下:

[AllowHtml]
[DataType(DataType.MultilineText)]
public string Description { get; set; }

我已经放入了[AllowHtml]属性,以便通过我构建的表单向该属性提交HTML,但我想做的是将该属性的值输出为原始HTML,而不进行转义。

我知道我可以使用Html.Raw(Model.Description),但我想要的是告诉Html.DisplayFor(m => m.Description)始终输出原始HTML的某种方式。有没有一个属性可以用来装饰类中的属性,我希望这样做?

基本上,这是我的懒惰——我不想记住哪些属性可能包含HTML,所以当我需要做上面的事情时,我不想考虑使用Html.Raw(…)——我更希望我的模型知道它应该做什么,并自动完成。我试着寻找答案,但要么我的措辞不正确,要么没有办法:(

谢谢,

始终使用MVC3和Razor输出原始HTML

更改Description项目以返回HtmlString

Razor不转义HtmlString
(事实上,Html.Raw所做的只是创建一个HtmlString

这实际上相当简单(一旦你知道如何…)。将DataType属性更改为[DataType(DataType.Html)],并创建一个局部视图,将其放在Views/Shared/DisplayTemplates/Html.cshtml中,如下所示:

@model string
@Html.Raw(Model)

当然,您也可以不更改DataType属性,并将视图命名为MultilineText.cshtml而不是Html.cshtml

只是在这里提供更多信息-您的问题是,除非您返回IHtmlString,否则@将始终为HtmlEncode-因此问题来源于@符号。这是剃刀语法的好处之一——htmlencode比不进行更安全。因此,这里没有"快速"的方法,因为问题的根源是@符号,如果找到IHtmlString,它将排除HtmlEncoding。所以,除非你使用旧的<%IMHO与剃刀相比糟糕的语法:)

在模型中使用MvcHtmlString(示例)数据类型而不是字符串允许为我传递原始html:

//escaped string
public string cLiteral { get; set; }
//raw html string
public MvcHtmlString labelMessage { get; set; }