Orchard: допиливаем комментарии

четверг, 25 ноября 2010, Александр Краковецкий

В прошлой заметке я рассказывал о системе управления контентом Orchard. Так как в данный момент эта система не до конца еще готова, то какие-то действия необходиом выполнять самому. Одним из недостатков последней версии Orchard (0.8) является отсутствие возможности публиковать комментарии с форматированием. В принципе, многие системы не позволяют расписывать памфлеты в комментариях, но в Orchard "из коробки" нет возможности даже разбивать текст на параграфы. Это, конечно, большой минус, так как нельзя ограничивать пользователей в их свободе мысли, поэтому было принято решение немного покопать в этом направлении. А так как решений, как обычно, больше одного, то кратко остановлюсь на нескольких вариантах решения проблемы. 

Итак, первый вариант, который стразу приходит на ум - это использовать HTML тэги прямо в комментариях, но этот способ сразу отбрасывается, так как Orchard по умолчанию декодирует все строки, поэтому вы увидите лишь преобразованный в текст HTML код.

Второй логичный вариант - это использовать метод HttpUtilities.HtmlDecode() для декодирования строк, но, как и в первом варианте, такой вариант попросту не работает.

Converts a string that has been HTML-encoded for HTTP transmission into a decoded string.

Namespace:  System.Web
Assembly:  System.Web (in System.Web.dll)

Дальше с помощью небольшого гугления была найдена еще один метод - Html.Raw(), который позволяет выводить декодированную сроку (об этом методе более детально можно почитать в статье http://www.asp.net/webmatrix/readme). Метод работает в Web Matrix Beta 3, но я не смог заставить его работать в Orchard, который крутится на MVC Beta 3 (если она там все-таки есть, просьба ткнуть меня пальцем):

The new Html.Raw method lets you render HTML markup as markup instead of rendering encoded output. (By default, ASP.NET Razor encodes strings before rendering them.) The syntax is:

Html.Raw(value)

The following example shows how to use Html.Raw:

@* Inserts literal markup into the page as specified in the value string. *@
@Html.Raw("<div>Hello <em>world</em>!</div>")

Но все оказалось достаточно просто - в .NET 4.0 появился класс HtmlString, который позволяет отображать декодированные строки:

Представляет HTML-кодированную строку, которую не следует перекодировать еще раз.

Пространство имен:  System.Web
Сборка:  System.Web (в System.Web.dll)

Таким образом, если заменить сроку

@comment.Record.CommentText

в файле ListOfComments.cshtml из сборки Orchard.Comments на

@(new HtmlString(comment.Record.CommentText)

то с большой долей вероятности вы увидите форматированные комментарии.

Но это достаточно простой способ, который не сильно удобный для пользователя, так как все теги необходимо писать самому. Но это еще не самое страшное - проблема в том, что пользователь может вставить много ненужного HTML, который вовсе не обязательно обрабатывать и хранить на сервере в базе as is.

Кстати, поделюсь еще одним интеерсным методом, который позволяет очищать HTML от вордовских тегов:

static string GetCleanedWordHtml(string html)
{
  // start by completely removing all unwanted tags
  html = Regex.Replace(html, @"<[/]?(font|span|xml|del|ins|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase);
  // then run another pass over the html (twice), removing unwanted attributes
  html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^\s>]+)([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
  html = Regex.Replace(html, @"<([^>]*)(?:class|lang|style|size|face|[ovwxp]:\w+)=(?:'[^']*'|""[^""]*""|[^\s>]+)([^>]*)>", "<$1$2>", RegexOptions.IgnoreCase);
  html = Regex.Replace(html, @"]*?>[\s\S]*?<\/style>", "", RegexOptions.IgnoreCase);
  html = Regex.Replace(html, @"", "", RegexOptions.IgnoreCase);
  //

      

Комментарии

Свежие вакансии