2011-01-21 7 views
17

Sto provando a pubblicare un modulo tramite un modello MVC in una funzione Salva in un controller. Sto anche usando tinymce dal lato client che risulta una stringa basata su codice HTML come <p> Content text blah blah ...</p>.Invia tag HTML (codici) come stringa con ASP.net MVC e JQuery

Il problema è che non riesco a pubblicare una stringa che include <p> something </p> Ma sorprendentemente, <p> something </p > questa stringa (con spazi dopo "<") NON ha alcun problema. Ma non posso gestire questo codice html e creare questi spazi prima di postare ogni volta. Ci deve essere un modo migliore.

Quindi, come posso inviare una stringa che include codice HTML tramite il metodo $ .post? (Se si deve sapere, questo progetto è un sistema di gestione dei contenuti. Quindi, devo salvare il testo del contenuto basato su HTML in una tabella SQL.) Vedo tramite il debug, l'azione successiva non raggiunge nemmeno il controller penso che questo sia un solo problema javascript, ho ragione?

Ecco il codice che sto 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... 
    }); 
} 

CS Codice


 
    [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; 
    } 

risposta

47

ASP.NET è dotato di richiesta validati su questo automaticamente aiuta a proteggere dagli attacchi XSS e HTML injection. Se si desidera disattivare in modo esplicito questa convalida si poteva decorare l'azione che si sta postando con l'attributo [ValidateInput(false)]:

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

anche se si esegue questo su ASP.NET 4.0 per questo attributo abbia effetto è necessario aggiungere quanto segue al web.config:

<httpRuntime requestValidationMode="2.0" /> 

E se si sta utilizzando ASP.NET MVC 3.0 si poteva decorare solo la proprietà del modello che richiede HTML con l'attributo [AllowHtml]:

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

    public string SomeOtherProperty { get; set; } 
} 

anche nella funzione javascript che probabilmente vuole serialize() invece di serializeArray():

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

Ciò ha risolto completamente il mio problema! –

+2

Molto utile. Ma ho funzionato in .NET 4.0 senza '' –

+0

[AllowHtml] <- questo –

3

Non si deve usare ValidateInput (false) come diceva MSN qui: http://msdn.microsoft.com/en-us/magazine/hh708755.aspx Basta usare [AllowHtml] sulla vostra proprietà modello che si desidera prendere html .

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

Inoltre, penso che sia meglio se si codifica l'html e quindi lo si invia al server.

0

utilizzando [ValidateInput (false)] è una pessima pratica che porta a molte violazioni della sicurezza, [AllowHtml] su una proprietà modello è più sicuro e affidabile modo di fare questo. Ma c'è una soluzione molto più pulita se non è possibile utilizzare una proprietà del modello.

Semplicemente Encode il testo sul lato client (mycase javascript), Decode sul lato servono (controllerfunzione). Ho usato il sotto per il mio progetto vb.net.

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

Ora codifica variabile sopra.

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

ora passaggio encodeSearchStringValue al controller utilizzando AJAX.

Nel controllore appena decodifica la variabile per ottenere <p> some blah...blah data </p>.

Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue) 

Spero che questo aiuti ......... :)