【问题标题】:Always output raw HTML using MVC3 and Razor始终使用 MVC3 和 Razor 输出原始 HTML
【发布时间】:2011-06-02 15:04:11
【问题描述】:

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

[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 属性设置为键入IHtmlString。那应该为你处理它。当然,根据您设置值的方式,它可能不适用于所有情况。

标签: c# asp.net asp.net-mvc-3 razor


【解决方案1】:

更改您的Description 属性以返回HtmlString

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

【讨论】:

  • 谢谢。我这样做时遇到的问题是 Entity Framework 不喜欢将属性定义为 HtmlString 类型,因此在创建模型时会收到大量模型错误。
  • @Dylan:您可以创建一个单独的 IHtmlString 类型的包装器属性并告诉 EF 忽略它。
  • 是的,我想我可以,但如果我说实话,这似乎太麻烦了!我想如果没有简单的(即快速并且涉及尽可能少的代码),那么我将继续使用Html.Raw(…)。不过还是谢谢。
  • @Dylan: public IHtmlString HtmlDescription { get { return new HtmlString(Description); } } 你也可以交换名字。
  • 我发现@Html.DisplayTextFor(model => model.HtmlDescription) 似乎也可以工作。我想使用其中一个 Html 助手比仅使用 @Model.HtmlDescription 有其好处(例如,如果属性是 null)。
【解决方案2】:

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

@model string
@Html.Raw(Model)

当然你也可以不改变你的DataType属性,将视图命名为MultilineText.cshtml而不是Html.cshtml

【讨论】:

  • 一直在寻找那个数据类型的东西。我只是没想到。
【解决方案3】:

只是在这里提供更多信息-您的问题是 @ 将始终 HtmlEncode 除非您返回了 IHtmlString-因此问题出在 @ 符号。这是 razor 语法的好处之一 - htmlencode 比没有更安全。所以这里没有“快速”的方法,因为你的问题的根源是@符号,如果它找到 IHtmlString,它将排除 HtmlEncoding。所以 - 除非你使用旧的

【讨论】:

  • 是的,确实如此。除了@SLaks 的建议之外,没有简单的方法可以解决它,所以我将保持原样并使用Html.Raw(…),因为我有太多的属性不得不去写重复的版本只是为了不使用Html.Raw(…)!!
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2015-07-15
  • 2016-06-30
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2011-10-31
  • 2012-11-23
相关资源
最近更新 更多