始终使用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(…)
——我更希望我的模型知道它应该做什么,并自动完成。我试着寻找答案,但要么我的措辞不正确,要么没有办法:(
谢谢,
更改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; }