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

C# 始终使用MVC3和Razor输出原始HTML,c#,asp.net,asp.net-mvc-3,razor,C#,Asp.net,Asp.net Mvc 3,Razor,我有一个具有如下属性的类: [AllowHtml] [DataType(DataType.MultilineText)] public string Description { get; set; } 我已经输入了[allowtml]属性,允许我通过构建的表单将HTML提交到此属性,但我要做的是将属性的值作为原始HTML输出,而不转义 我知道我可以使用Html.Raw(Model.Description),但我要寻找的是告诉Html.DisplayFor(m=>m.Description)始终

我有一个具有如下属性的类:

[AllowHtml]
[DataType(DataType.MultilineText)]
public string Description { get; set; }
我已经输入了
[allowtml]
属性,允许我通过构建的表单将HTML提交到此属性,但我要做的是将属性的值作为原始HTML输出,而不转义

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

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


谢谢,

更改您的
说明
权限以返回
HtmlString

Razor不会逃逸
HtmlString
值。

(事实上,
Html.Raw
所做的就是创建一个
HtmlString

这里提供更多信息-您的问题是@将始终使用HtmlEncode,除非您返回IHtmlString-因此问题来源于@符号。这是razor语法的好处之一-使用HtmlEncode比不使用HtmlEncode更安全。因此,这里没有“快速”方法,因为您的问题的根源是@符号,它将排除HtmlEncoding如果它找到IHtmlString.So-除非使用旧的否则没有“快速”解决方法这实际上相当简单(一旦您知道如何…)。将您的数据类型attrib更改为
[DataType(DataType.Html)]
,并创建一个局部视图,将其放入
视图/Shared/DisplayTemplates/Html.cshtml
,如下所示:

@model string
@Html.Raw(Model)

当然,您也不能更改数据类型attrib,也不能将视图命名为
multilitext.cshtml
而不是
Html.cshtml

您可以将
Description
属性设置为type
IHtmlString
。这应该会为您解决问题。当然,取决于您如何设置该值,它可能并不适用于所有情况s、 谢谢。我这样做的问题是,实体框架不喜欢将属性定义为HtmlString类型,因此在创建模型时,我会收到大量的模型错误。@Dylan:您可以创建一个单独的
IHtmlString
类型的包装器属性,并告诉EF忽略它。是的,我想我可以,尽管它看起来太多了如果我诚实的话,那就麻烦了!我想如果没有简单的方法(即快速且涉及尽可能少的代码),那么我将继续使用
Html.Raw(…)
。谢谢。@Dylan:
public IHtmlString HtmlDescription{get{返回新的HtmlString(Description);}
您也可以交换名称。我发现
@Html.DisplayTextFor(model=>model.HtmlDescription)
似乎也可以工作。我想使用一个Html帮助程序比只使用
@model.HtmlDescription
有好处(例如,如果属性为
null
)是的,当然有。除了@SLaks的建议之外,没有简单的解决方法,所以我就让它保持原样,使用
Html.Raw(…)
,因为我有太多的属性,为了不使用
Html.Raw(…)而不得不编写重复的版本
!!一直在寻找那个数据类型的东西。我只是没想到。