2011-01-21 59 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) 

希望这有助于......... :)

相关问题