Опубликовать HTML-тег (коды) в виде строки с ASP.net MVC & JQuery
Я пытаюсь отправить форму через модель MVC в функцию сохранения в контроллере. Я также использую tinymce на стороне клиента, который выводит строку на основе HTML-кода, такую как <p> Content text blah blah ...</p>
.
Проблема заключается в том, что я не могу опубликовать строку, которая включает <p> something </p>
Но удивительно, что < p > something < / p >
эта строка (с пробелами после "<" ) не имеет проблемы. Но я не могу обработать этот HTML-код и делать эти пробелы перед публикацией каждый раз. Должен быть лучший способ.
Итак, как я могу опубликовать строку, которая включает HTML-код через метод $.post? (Если вы должны знать, этот проект представляет собой систему управления контентом, поэтому мне нужно сохранить текст на основе HTML на основе таблицы SQL.) Я видел, отлаживая, post action даже не. к контроллеру, и я думаю, что это единственная проблема с javascript, я прав?
Вот код, который я использую:
Javascript
function JqueryFromPost(formId) {
var form = $(formId);
var action = form.attr("action");
var serializedForm = form.serializeArray();
$.post(action, serializedForm, function (data) {
//Getting the data Result here...
});
}
Код CS
[HttpPost]
public JsonResult SaveArticle(ArticleModel model)
{
JsonResult JResult = new JsonResult();
if (ModelState.IsValid)
//I do the saving here ending with "JResult.Data = "Success";" (this could also be Failed. So, its just to explain)
return JResult;
}
Ответы
Ответ 1
ASP.NET имеет встроенную проверку запросов, которая автоматически помогает защитить от атак XSS и HTML. Если вы хотите явно отключить эту проверку, вы можете украсить действие, которое вы отправляете, с помощью атрибута [ValidateInput(false)]
:
[HttpPost]
[ValidateInput(false)]
public ActionResult SaveArticle(ArticleModel model)
{
var JResult = new JsonResult();
if (ModelState.IsValid)
{
...
}
return JResult;
}
Также, если вы используете это на ASP.NET 4.0 для вступления этого атрибута, вам нужно добавить следующее в свой web.config:
<httpRuntime requestValidationMode="2.0" />
И если вы используете ASP.NET MVC 3.0, вы можете украсить только свойство вашей модели, которое требует HTML с атрибутом [AllowHtml]
public class ArticleModel
{
[AllowHtml]
public string SomeProperty { get; set; }
public string SomeOtherProperty { get; set; }
}
Также в вашей функции javascript вы, возможно, хотите serialize()
вместо serializeArray()
:
function JqueryFromPost(formId) {
var form = $(formId);
$.post(form.action, form.serialize(), function (data) {
//Getting the data Result here...
});
}
Ответ 2
Вы не должны использовать ValidateInput (false), как сказал MSN здесь: http://msdn.microsoft.com/en-us/magazine/hh708755.aspx
Просто используйте [AllowHtml]
в свойстве модели, которое вы хотите взять html.
[AllowHtml]
public String htmlContainer { get; set; }
Кроме того, я думаю, что лучше, если вы кодируете html, а затем отправляете его на сервер.
Ответ 3
Использование [ValidateInput (false)] - очень плохая практика, которая приводит к многочисленным нарушениям безопасности,
[AllowHtml] для свойства модели более надежный и надежный способ сделать это. Но есть гораздо более чистое решение, если вы не можете использовать свойство модели.
Просто Кодировать текст на стороне клиента (mycase javascript), Декодировать на стороне сервиса (Контроллер > ).
Я использовал ниже для моего проекта vb.net.
var SearchStringValue = <p> some blah...blah data </p>
Теперь кодировка приведенная выше переменная.
var encodedSearchStringValue = window.escape(document.getElementById('SearchStringValue').value)
теперь передайте encodeSearchStringValue в контроллер с помощью ajax.
В контроллере просто декодировать переменную, чтобы получить <p> some blah...blah data </p>.
Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)
Надеюсь, это поможет.........:)