Кодирование и декодирование HTML с использованием MVC3 - PullRequest
2 голосов
/ 12 декабря 2011

Я пишу сайт MVC3, который использует tinymce как текстовый редактор WYSIWYG.Я сохраняю этот текст с помощью вызова AJAX, используя jQuery.Я обнаружил, что запрос не отправляется, если мои данные содержат HTML, поэтому мне нужно сделать следующее:

 var postData = {
                  couponId: couponId,
                  coupon: escape(coupon),
                  imagePath: image,
                  imageAlignment: imageAlignment
                };

             $.post('@(Url.Action("SaveCoupon"))', postData, function (data) {

, чтобы мои данные были переданы на сервер.Это превращает

<p>this is a test</p>

в

%3Cp%3Ethis%20is%20a%20test%3C/p%3E

Я пытался понять, как преобразовать его обратно.Классы HtmlString, HtmlHelper и HttpUtility просто возвращают его дословно, я думал, что HttpUtility.HtmlDecode - это то, что мне нужно было точно, но просто он не делает то, что мне нужно.Мне нужно сохранить это как декодированный HTML в моей базе данных, поэтому я не могу просто перекодировать его на стороне клиента (хотя я обеспокоен тем, что я не смогу отправить его обратно, используя AJAX, я недаже так далеко, пока).Каков наилучший способ передачи HTML через вызов AJAX, сохранить его в том виде, в котором он был введен, и вернуть его обратно клиенту для отображения?

Ответы [ 4 ]

2 голосов
/ 12 декабря 2011

Я обнаружил, что запрос не отправлен, если мои данные включают HTML

Нет, вы ошиблись. Запрос отправлен, но сервер отклоняет его, поскольку он содержит опасные символы. По сути, он генерирует исключение до того, как достигнет действия вашего контроллера. В ASP.NET MVC 3 есть несколько возможностей избежать этого.

Первый - украсить свойство модели представления, которое получит HTML, с атрибутом [AllowHtml] (рекомендуется):

public class CouponViewModel
{
    public int CouponId { get; set; }
    [AllowHtml]
    public string Coupon { get; set; }
    public string ImagePath { get; set; }
    public string ImageAlignementh { get; set; }
}

Это то, что ваше действие контроллера примет в качестве параметра:

[HttpPost]
public ActionResult SaveCoupon(CouponViewModel model)
{
    ...
}

Теперь при отправке запроса AJAX не выполняйте никаких действий по экранированию или чего-либо еще. jQuery позаботится о правильном кодировании URL ваших параметров:

var postData = {
    couponId: couponId,
    coupon: coupon,
    imagePath: image,
    imageAlignment: imageAlignment
};

$.post('@Url.Action("SaveCoupon")', postData, function (data) {
    ...
});

Другая возможность - украсить все действие атрибутом [ValidateInput], который отключит проверку запроса для всего запроса (не рекомендуется):

[HttpPost]
[ValidateInput(false)]
public ActionResult SaveCoupon(CouponViewModel model)
{
    ...
}
1 голос
/ 21 января 2012

Я видел похожую проблему с движком бритвы в webmatrix.Пост кажется зависшим, потому что действие запроса вызывает «потенциально опасную ошибку содержимого».

Мое частичное решение - использовать Request.Unvalidated().Form["form_name"] для извлечения строки, которая включает данные формы tinymce.

Затем я перекодирую и сохраняю его в своей базе данных.К сожалению, в движке бритвы используется другая кодировка, чем в JQuery, поэтому я пока не могу расшифровать ее для своих панелей Ajax.

1 голос
/ 12 декабря 2011

Я не совсем уверен, почему HtmlDecode не делает то, что вам нужно, но у меня есть альтернативный подход.Вы можете разрешить отправку html-данных, поместив следующий атрибут на свой контроллер

[ValidateInput (false)]

В .Net 4 вам также может понадобиться

<httpRuntime requestValidationMode="2.0" /> 

в вашем web.config

Конечно, вам придется самостоятельно бороться с возможностью злонамеренного ввода.


Еще одна возможность, которую я хотел проверить - как вывывод вашего HTML?В бритве вам нужно использовать @ Html.Raw (mystring), иначе ваша строка будет автоматически экранирована снова.

0 голосов
/ 12 декабря 2011

Если вы не хотите, чтобы ваш текст был закодирован, вы можете использовать метод расширения Raw;

@Html.Raw("<p>this is a test</p>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...