Estoy tratando de publicar un formulario a través de un modelo MVC en una función Guardar en un controlador. También estoy usando tinymce en el lado del cliente, lo que da como resultado una cadena basada en código HTML como <p> Content text blah blah ...</p>
.
El problema es que no puedo publicar una cadena que incluya <p> something </p>
Pero, sorprendentemente, < p > something < / p >
esta cadena (con espacios después de "<") NO tiene ningún problema. Pero no puedo manejar este código html y hacer estos espacios antes de publicar cada vez. Debe haber una mejor manera.
Entonces, ¿cómo puedo publicar una cadena que incluya código HTML a través del método $.post? (Si debe saberlo, este proyecto es un sistema de administración de contenido. Por lo tanto, tengo que guardar el texto del contenido basado en HTML en una tabla SQL). Vi al depurar que la acción posterior ni siquiera llega al controlador y creo que esto es solo un problema de javascript, ¿verdad?
Aquí está el código que estoy usando:
JavaScript
función JqueryFromPost(formId) { var formulario = $(formId); var acción = form.attr("acción"); var serializedForm = form.serializeArray(); $.post(acción, formulario serializado, función (datos) { //Obteniendo el resultado de los datos aquí... }); }
código CS
[Publicación HTTP] público JsonResult SaveArticle (modelo ArticleModel) { JsonResult JResult = nuevo JsonResult(); si (ModelState.IsValid) //Hago el guardado aquí que termina con "JResult.Data = "Success";" (esto también podría fallar. Entonces, es solo para explicar) devolver JResultado; }
ASP.NET tiene una validación de solicitud integrada que ayuda automáticamente a proteger contra ataques de inyección de XSS y HTML. Si desea deshabilitar explícitamente esta validación, puede decorar la acción que está publicando con el atributo [ValidateInput(false)]
:
[HttpPost] [ValidateInput(false)] public ActionResult SaveArticle(ArticleModel model) { var JResult = new JsonResult(); if (ModelState.IsValid) { ... } return JResult; }
Además, si está ejecutando esto en ASP.NET 4.0 para que este atributo surta efecto, debe agregar lo siguiente a su web.config:
<httpRuntime requestValidationMode="2.0" />
Y si está utilizando ASP.NET MVC 3.0, puede decorar solo la propiedad en su modelo que requiere HTML con el atributo [AllowHtml]
:
public class ArticleModel { [AllowHtml] public string SomeProperty { get; set; } public string SomeOtherProperty { get; set; } }
También en su función de JavaScript, probablemente desee serialize()
en lugar de serializeArray()
:
function JqueryFromPost(formId) { var form = $(formId); $.post(form.action, form.serialize(), function (data) { //Getting the data Result here... }); }
No debe usar ValidateInput (falso) como dijo MSN aquí: http://msdn.microsoft.com/en-us/magazine/hh708755.aspx Simplemente use [AllowHtml]
en la propiedad de su modelo que desea tomar html.
[AllowHtml] public String htmlContainer { get; set; }
Además, creo que es mejor si codifica html y luego lo publica en el servidor.
Usar [ValidateInput(false)] es una práctica muy mala que conduce a muchas infracciones de seguridad, [AllowHtml] en una propiedad modelo es una forma más segura y confiable de hacerlo. Pero hay una solución mucho más limpia si no puede usar una propiedad de modelo.
Simplemente codifica el texto en el lado del cliente ( mycase javascript ), descifralo en el lado del servicio ( función del controlador ). Usé lo siguiente para mi proyecto vb.net.
var SearchStringValue = <p> some blah...blah data </p>
Ahora codificando la variable anterior.
var encodedSearchStringValue = window.escape(document.getElementById('SearchStringValue').value)
ahora pase encodeSearchStringValue al controlador usando ajax.
En el controlador simplemente decodifique la variable para obtener <p> some blah...blah data </p>.
Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)
Espero que esto ayude......... :)