将ASP标签(代码)作为字符串发布到ASP.net MVC& JQuery的

时间:2011-01-21 14:04:24

标签: jquery asp.net-mvc ajax

我正在尝试通过MVC模型将Form发布到控制器中的Save函数中。我也在客户端使用tinymce,这导致基于HTML代码的字符串,如<p> Content text blah blah ...</p>

问题是我无法发布包含<p> something </p>的字符串但令人惊讶的是,< p > something < / p >此字符串(在“&lt;”之后带有空格)没有问题。但是,我无法处理这个HTML代码并在每次发布之前创建这些空格。肯定有更好的办法。

那么,如何通过$ .post方法发布包含HTML代码的字符串? (如果你必须知道,这个项目是一个内容管理系统。所以,我必须将基于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;
   }

3 个答案:

答案 0 :(得分:51)

ASP.NET具有内置请求验证功能,可自动帮助防止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,则只能修饰模型中需要具有[AllowHtml]属性的HTML的属性:

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...
    });
}

答案 1 :(得分:3)

你不应该使用ValidateInput(false),因为MSN在这里说:http://msdn.microsoft.com/en-us/magazine/hh708755.aspx 只需在您想要的模型属性上使用[AllowHtml]即可。

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

此外,我认为如果您编码html然后将其发布到服务器会更好。

答案 2 :(得分:1)

使用 [ValidateInput(false)] 是一种非常糟糕的做法,会导致许多安全漏洞, 模型属性上的 [AllowHtml] 是更安全可靠的方法。 但是如果你不能使用模型属性,那么有一个更清洁的解决方案。

只需编码客户端上的文字(mycase javascript ),解码服务端(控制器 > 功能)。 我将以下内容用于我的vb.net项目。

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

现在编码上述变量。

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

现在使用ajax将encodeSearchStringValue传递给控制器​​。

在控制器中只需解码变量即可获得<p> some blah...blah data </p>.

Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)

希望这会有所帮助......... :)。