@ item.BodyText в неформатном формате в MVC3 - PullRequest
2 голосов
/ 28 февраля 2012

Когда я использую @ 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-теги были представлены не в виде строк, а для работы и форматирования текста. Чтобы это выглядело так:

Штат Луизиана для государственных расходов программа 21 июня 2011 года

Обновление программного обеспечения: версия 3.1 работает на 10% быстрее

Я использую Umbraco 5 на основе .Net Framework 4 и MVC3.

Код моего частичного просмотра:

@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 ]

5 голосов
/ 28 февраля 2012

В Razor это происходит по соображениям безопасности.Все выходные данные в формате HTML кодируются для предотвращения инъекций.

Вам всегда нужно явно указать, что вы не хотите, чтобы Razor HTML кодировал ваш необработанный вывод, вы можете сделать это, обернув свой оператор вспомогательным средством Html.Raw()Метод:

Заменить:

@item.BodyText

на:

@Html.Raw(item.BodyText)
1 голос
/ 28 февраля 2012

В вашей модели вам необходимо указать свойство в виде другого типа строки:

public string BodyText { get; set; }
public HtmlString BodyHtml
{
    get
    {
        return new HtmlString(BodyText);
    }
}

Тогда вы можете использовать:

@item.BodyHtml

без необходимости использования каких-либо методов HtmlHelper ввид.

0 голосов
/ 28 февраля 2012

Существует очень веская причина, по которой Razor кодирует вывод.Вам нужно защитить от XSS.Вы должны обернуть Html.Raw в дезинфицирующее средство HTML.Одним из подходов является использование HtmlAgility Pack См. http://htmlagilitypack.codeplex.com/discussions/24346 Если вы можете гарантировать, что БД никогда не будет скомпрометирована, вы можете пропустить дезинфицирующее средство.Системы DB / CMS подвергались критике, люди были обмануты и т. Д.

0 голосов
/ 28 февраля 2012

Другой альтернативой является замена:

@item.BodyText

на:

@MvcHtmlString.Create(item.BodyText)
...