formulario - Publicar etiquetas HTML(códigos) como cadena con ASP.net MVC y JQuery
razor form asp net mvc (3)
ASP.NET tiene una validación de solicitud integrada que ayuda automáticamente a proteger contra ataques de inyección 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 tenga efecto, debe agregar lo siguiente a su web.config:
<httpRuntime requestValidationMode="2.0" />
Y si está utilizando ASP.NET MVC 3.0, podría 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 la función javascript es probable que desee serialize()
lugar de serializeArray()
:
function JqueryFromPost(formId) {
var form = $(formId);
$.post(form.action, form.serialize(), function (data) {
//Getting the data Result here...
});
}
Estoy intentando 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 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 publicarlos cada vez. Tiene que 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 que al realizar una depuración, la acción posterior ni siquiera llega al Controlador y creo que esto Es un problema único de javascript, ¿verdad?
Aquí está el código que estoy usando:
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... }); }
Código 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; }
No debe usar ValidateInput (falso) como dice MSN aquí: http://msdn.microsoft.com/en-us/magazine/hh708755.aspx Solo use [AllowHtml]
en la propiedad modelo que desea que lleve 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 muy mala práctica que conduce a muchas violaciones 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 puedes usar una propiedad modelo.
Simplemente codifique el texto en el lado del cliente (mycase javascript ), decodifíquelo en el lado del servicio ( función del controlador ). Usé el 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......... :)