2011-01-21 65 views
17

我試圖通過MVC模型發佈到控制器中的保存功能的窗體。我也在客戶端使用tinymce,導致基於HTML代碼的字符串,如<p> Content text blah blah ...</p>將HTML標記(代碼)作爲字符串與ASP.net MVC和JQuery

問題是我不能發表一個包含<p> something </p>的字符串,但令人驚訝的是,這個字符串(在「<」之後有空格)沒有問題。但是,我無法處理這個html代碼,並在每次發佈之前創建這些空格。一定會有更好的辦法。

那麼,如何發佈包含HTML代碼的字符串$ .post方法? (如果你必須知道,這個項目是一個內容管理系統,所以我必須將基於HTML的內容文本保存到一個SQL表中。)通過調試,我發現後動作甚至不會將連接到控制器,而我認爲這是一個唯一的JavaScript問題,我說得對嗎?

這裏是我使用的代碼:
的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代碼


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

回答

47

ASP.NET內置了請求validati自動地幫助防止XSS和HTML注入攻擊。如果你想明確禁用此驗證,你可以裝點您發佈與[ValidateInput(false)]屬性的操作:

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

另外,如果你是在ASP.NET 4.0中爲這個屬性運行此生效,您需要添加下面給你的web.config:

<httpRuntime requestValidationMode="2.0" /> 

如果你正在使用ASP.NET MVC 3.0,你可以只裝飾你的模型,需要HTML與[AllowHtml]屬性的屬性:

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

    public string SomeOtherProperty { get; set; } 
} 

而且在你的JavaScript功能你可能想serialize()而不是serializeArray()

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

這徹底解決了我的問題! – 2011-01-21 15:09:25

3

,則不應使用ValidateInput(假)的MSN在這裏說:http://msdn.microsoft.com/en-us/magazine/hh708755.aspx 剛上你的模型屬性使用[AllowHtml]你要採取的html 。

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

此外,我認爲這是更好的,如果你編碼的HTML,然後發佈到服務器。

0

使用[ValidateInput(假)是一個非常不好的做法,導致許多安全漏洞, [AllowHtml]模型上的屬性更安全和這樣做的可靠方法。 但是,如果您不能使用模型屬性,則有一個更清潔的解決方案。

只需編碼客戶端上的文本(mycase JavaScript的),解碼它在發球上側(控制器功能)。 我使用下面的我的vb.net項目。

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

現在編碼上述變量。

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

現在通過encodeSearchStringValue使用AJAX控制器。

在控制器剛剛解碼的變量獲得<p> some blah...blah data </p>.

Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue) 

希望這有助於......... :)

相關問題