2011-01-21 21 views
17
ile yazarak gönderin

Bir MVC Modeli aracılığıyla bir Form bir denetleyicide bir Kaydet işlevi göndermeye çalışıyorum. Aynı zamanda, istemci tarafında, <p> Content text blah blah ...</p> gibi bir HTML kod tabanlı dizgi ile sonuçlanan tinymce kullanıyorum.HTML etiketlerini (kodları) ASP.NET MVC & JQuery

Sorun şu ki, <p> something </p> içeren bir dize yayınlayamıyorum Ancak şaşırtıcı şekilde, <p> something </p > bu dize ("<" sonrası boşluklarla) NO sorunu yok. Ancak, bu html kodunu işleyemiyorum ve bu alanları her defasında göndermeden önce yapamıyorum. Daha iyi bir yol olmalı.

Peki, HTML kodu içeren bir dizeyi $ .post yöntemiyle nasıl gönderebilirim? (Eğer bilmeniz gerekiyorsa, bu proje bir İçerik Yönetim Sistemidir. Bu yüzden, HTML tabanlı içerik metnini bir SQL tablosuna kaydetmeliyim.) Hata ayıklama yaparak gördüm, eylemi sonrası Denetleyiciye ulaşmıyor ve ben Bunun sadece javascript sorunu olduğunu düşünüyorum, doğru muyum? İşte

kullanıyorum kodudur:
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 Kod


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

cevap

47

ASP.NET yerleşik istek validati Bu otomatik olarak XSS ve HTML enjeksiyon saldırılarına karşı korumaya yardımcı olur. Açıkça bu doğrulama devre dışı bırakmak istiyorsanız size [ValidateInput(false)] özniteliği ile yayın yapıyorsunuz eylemi süslemeleri: Ayrıca

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

Eklemek gerekir Etkili olması için bu özellik için ASP.NET 4.0 bu çalıştırıyorsanız

<httpRuntime requestValidationMode="2.0" /> 

Ve eğer sen [AllowHtml] özniteliği ile HTML gerektirir modelinize sadece mülkiyet dekore olabilir ASP.NET MVC 3.0 kullanıyorsanız: web.config aşağıdaki

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

    public string SomeOtherProperty { get; set; } 
} 

Ayrıca javascript işlevinde muhtemelen serialize() yerine serializeArray() istiyorum: MSN burada söylediği gibi

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

Bu tamamen benim sorun çözüldü! –

+2

Çok yardımcı. Ama ben ' –

+0

[AllowHtml] <- olmadan .NET 4.0'da çalışıyorum. –

3

Sen (false) ValidateInput kullanmamalısınız: http://msdn.microsoft.com/en-us/magazine/hh708755.aspx Sadece almak istediğiniz modeli mülkiyet [AllowHtml] kullanmak html .

Ayrıca html'yi kodlar ve sonra sunucuya gönderirseniz daha iyi olduğunu düşünüyorum. [ValidateInput (false)] bir modeli daha sabitlenir mülkiyet ve bunu yapmanın güvenilir yolu üzerinde, birçok güvenlik ihlalleri için [AllowHtml] açar çok kötü bir uygulamadır kullanma

0

. Ancak, model özelliğini kullanamıyorsanız daha temiz bir çözüm var.

Basitçe Encode İstemci Side metni (mycase javascript), hizmet tarafında (Kontrolörfonksiyon) üzerinde Decode o. Ben vb.net projem için aşağıda kullanmıştım.

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

Şimdi kodlayan, yukardaki değişken.

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

hemen ajax kullanarak kontrol cihazına encodeSearchStringValue geçmektedir. denetleyici olarak

sadece kod çözme değişken ......... bu yardımcı olur <p> some blah...blah data </p>.

Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue) 

Umut almak için :)