当我使用@ item.BodyText时,我得到了原始的html输出 - 其中包含html标签作为字符串。它看起来像是:
<p>State of Louisiana for state funded dispensing program<br>June 21, 2011<br><br>Software update:<br>Version 3.1 is 10% faster<br>
我需要那些html标签不是作为字符串呈现,而是为了工作和格式化文本。所以它看起来更像是:
路易斯安那州政府资助配药 计划2011年6月21日
软件更新:版本3.1快10%
我正在使用基于.Net Framework 4和MVC3的Umbraco 5.
我的部分观点代码:
@inherits RenderViewPage
@using Umbraco.Cms.Web;
@{
var Homepage = @DynamicModel;
while (Homepage.ContentType.Alias != "homePage")
{
Homepage = Homepage.Parent;
}
}
@foreach (var item in Homepage.Children)
{
if (@item.CurrentTemplate != null)
{
var childName = item.Name ?? "(No name yet)";
if (childName == "News")
{
@item.BodyText
}
}
}
我尝试使用@Umbraco.Field(Model, "bodyText")
代替@item.BodyText
,但后来我获得了当前页面的内容,而不是我需要的“新闻”页面。
任何帮助非常感谢!
答案 0 :(得分:5)
在Razor中,这是出于安全原因。所有视图输出都是Html编码,以防止注入。
您总是需要明确声明您不希望Razor对您的原始输出进行HTML编码,您可以通过使用Html.Raw()
辅助方法包装语句来执行此操作:
替换:
@item.BodyText
使用:
@Html.Raw(item.BodyText)
答案 1 :(得分:1)
在模型中,您需要将属性指定为不同类型的字符串:
public string BodyText { get; set; }
public HtmlString BodyHtml
{
get
{
return new HtmlString(BodyText);
}
}
然后你可以使用:
@item.BodyHtml
无需在视图中使用任何HtmlHelper方法。
答案 2 :(得分:0)
另一种选择是替换:
@item.BodyText
使用:
@MvcHtmlString.Create(item.BodyText)
答案 3 :(得分:0)
Razor编码输出有一个很好的理由。您需要防范XSS。您应该将Html.Raw包装在HTML清理程序中。一种方法是使用HtmlAgility Pack 见http://htmlagilitypack.codeplex.com/discussions/24346 如果您可以保证DB永远不会受到损害,那么您可以跳过消毒剂。 DB / CMS系统已被完成,人们被欺骗等等。