@ item.BodyText在MVC3中不是原始格式

时间:2012-02-28 14:24:17

标签: .net html asp.net-mvc razor umbraco

当我使用@ item.BodyText时,我得到了原始的html输出 - 其中包含html标签作为字符串。它看起来像是:

<p>State of Louisiana for state funded&nbsp; 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,但后来我获得了当前页面的内容,而不是我需要的“新闻”页面。

任何帮助非常感谢!

4 个答案:

答案 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 Packhttp://htmlagilitypack.codeplex.com/discussions/24346 如果您可以保证DB永远不会受到损害,那么您可以跳过消毒剂。 DB / CMS系统已被完成,人们被欺骗等等。