Опубликовать 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)

Надеюсь, это поможет.........:)