【问题标题】:Post HTML tag (codes) as string with ASP.net MVC & JQuery使用 ASP.net MVC 和 JQuery 将 HTML 标记(代码)作为字符串发布
【发布时间】:2011-06-13 04:19:41
【问题描述】:

我正在尝试通过 MVC 模型将表单发布到控制器中的保存函数中。我还在客户端使用 tinymce,它会生成基于 HTML 代码的字符串,例如 <p> Content text blah blah ...</p>

问题是我无法发布包含<p> something </p> 的字符串但令人惊讶的是,< p > something < / p > 这个字符串(“

那么,如何通过 $.post 方法发布包含 HTML 代码的字符串? (如果你必须知道,这个项目是一个内容管理系统。所以,我必须将基于 HTML 的内容文本保存到一个 SQL 表中。)我通过调试看到,post action 甚至没有达到到控制器,我认为这是唯一的 javascript 问题,对吗?

这是我正在使用的代码:
Javascript


函数 JqueryFromPost(formId) { 变种形式 = $(formId); var action = form.attr("action"); var serializedForm = form.serializeArray(); $.post(action, serializedForm, function (data) { //在这里获取数据结果... }); }

CS 代码


[HttpPost] public JsonResult SaveArticle(ArticleModel 模型) { JsonResult JResult = new JsonResult(); 如果(模型状态。IsValid) //我在这里保存以“JResult.Data = “Success”;”结尾(这也可能是失败的。所以,它只是为了解释) 返回 JResult; }

【问题讨论】:

    标签: jquery asp.net-mvc ajax


    【解决方案1】:

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

    【讨论】:

    • 非常有帮助。但我在没有&lt;httpRuntime requestValidationMode="2.0" /&gt; 的情况下让它在 .NET 4.0 中工作
    【解决方案2】:

    你不应该像 MSN 所说的那样使用 ValidateInput(false):http://msdn.microsoft.com/en-us/magazine/hh708755.aspx 只需在要获取 html 的模型属性上使用 [AllowHtml]

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

    另外,我认为最好将 html 编码然后发布到服务器。

    【讨论】:

      【解决方案3】:

      使用 [ValidateInput(false)] 是一种非常糟糕的做法,会导致许多安全漏洞, [AllowHtml] 在模型属性上执行此操作更安全可靠。 但如果您不能使用模型属性,则有一个更简洁的解决方案。

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

      var SearchStringValue = &lt;p&gt; some blah...blah data &lt;/p&gt;

      现在编码上述变量。

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

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

      在控制器中,只需解码变量以获得&lt;p&gt; some blah...blah data &lt;/p&gt;.

      Dim SearchStringValue = HttpUtility.UrlDecode(encodeSearchStringValue)
      

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

      【讨论】:

        猜你喜欢
        • 2017-05-23
        • 2018-03-27
        • 1970-01-01
        • 2012-07-13
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        相关资源
        最近更新 更多