web-dev-qa-db-fra.com

Publier une balise HTML (codes) sous forme de chaîne avec ASP.net MVC & JQuery

J'essaie de publier un formulaire via un modèle MVC dans une fonction Enregistrer dans un contrôleur. J'utilise également tinymce du côté client, ce qui résulte en une chaîne de code HTML telle que <p> Content text blah blah ...</p>.

Le problème est que je ne peux pas poster une chaîne qui inclut <p> something </p> Mais étonnamment, < p > something < / p > cette chaîne (avec des espaces après "<") n'a AUCUN problème. Mais, je ne peux pas gérer ce code HTML et faire ces espaces avant de poster à chaque fois. Il doit y avoir un meilleur moyen. 

Alors, comment puis-je poster une chaîne qui inclut du code HTML via la méthode $ .post? (Si vous devez savoir, ce projet est un système de gestion de contenu. Donc, je dois enregistrer le texte de contenu basé HTML dans une table SQL.) J'ai vu par le débogage, l'action post n'a même pas atteindre le contrôleur et je pense que c'est un problème uniquement en javascript, ai-je raison?

Voici le code que j'utilise:
Javascript


 fonction JqueryFromPost (formId) {
 
 var form = $ (formId); 
 var action = form.attr ("action"); 
 var serializedForm = form.serializeArray (); 
 
 $ .post (action, serializedForm, function (data) {
 // Obtenir les données Résultat ici ... 
}); 
} 

Code CS


 [HttpPost] 
 Public JsonResult SaveArticle (modèle ArticleModel) 
 {
 JsonResult JResult = new JsonResult (); 
 
 Si (ModelState.IsValid) 
 // Je sauvegarde ici en terminant par "JResult.Data =" Success ";" (cela pourrait aussi être un échec. Donc, c'est juste pour expliquer) 
 
 return JResult; 
} 
22
E-A

ASP.NET intègre une validation des demandes qui aide automatiquement à se protéger contre les attaques par injection XSS et HTML. Si vous souhaitez désactiver explicitement cette validation, vous pouvez décorer l'action que vous publiez avec l'attribut [ValidateInput(false)] :

[HttpPost]
[ValidateInput(false)]   
public ActionResult SaveArticle(ArticleModel model)
{
    var JResult = new JsonResult();
    if (ModelState.IsValid)
    {
        ...
    }
    return JResult;
}

De plus, si vous utilisez ceci sur ASP.NET 4.0 pour que cet attribut prenne effet, vous devez ajouter ce qui suit à votre fichier web.config:

<httpRuntime requestValidationMode="2.0" />

Et si vous utilisez ASP.NET MVC 3.0, vous pouvez uniquement décorer la propriété de votre modèle qui requiert HTML avec l'attribut [AllowHtml] :

public class ArticleModel 
{
    [AllowHtml]
    public string SomeProperty { get; set; }

    public string SomeOtherProperty { get; set; }
}

Toujours dans votre fonction javascript, vous voudrez probablement serialize() au lieu de serializeArray() :

function JqueryFromPost(formId) {
    var form = $(formId);
    $.post(form.action, form.serialize(), function (data) {
        //Getting the data Result here...
    });
}
51
Darin Dimitrov

Vous ne devez pas utiliser ValidateInput (false) comme MSN l’a dit ici: http://msdn.Microsoft.com/en-us/magazine/hh708755.aspx Utilisez simplement [AllowHtml] sur votre modèle propriété que vous voulez prendre en HTML.

[AllowHtml]
public String htmlContainer { get; set; }

De plus, je pense que c'est mieux si vous encodez du code HTML et que vous le postez ensuite sur le serveur.

3
QMaster

L'utilisation de [ValidateInput (false)] est une très mauvaise pratique entraînant de nombreuses violations de la sécurité, [AllowHtml] sur une propriété modèle est un moyen plus sécurisé et plus fiable de le faire. Mais il existe une solution beaucoup plus propre si vous ne pouvez pas utiliser une propriété de modèle.

Simplement Encode le texte côté client (mycase javascript ), Decode le côté serveur ( Controller function ). J'ai utilisé le ci-dessous pour mon projet vb.net.

var SearchStringValue = <p> some blah...blah data </p>

Now encoding la variable ci-dessus.

var encodedSearchStringValue = window.escape(document.getElementById('SearchStringValue').value)

transmettez maintenant encodeSearchStringValue au contrôleur en utilisant ajax.

Dans le contrôleur, il suffit de décoder la variable pour obtenir <p> some blah...blah data </p>.

Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)

J'espère que cela t'aides......... :)

1
Satwik Vemula