javascript 通过 AJAX 调用将Html字符串从视图传递到控制器

vs3odd8k  于 2023-01-29  发布在  Java
关注(0)|答案(6)|浏览(138)

我有一个需求,我需要传递一个div标记的所有HTML到控制器。我能够得到HTML,但代码失败时,我通过ajax传递HTML。
这是我的密码。

    • 查看:**
function abc() {

  var html = $("#div").html();

  data = {
    Html: html
  };

  $.ajax({
        url: '@Url.Action("DisplayResult", "Default")', //
        data: data,
        type: "POST",
        contentType: "application/json; charset=utf-8",
        success: function(result) {
          //do something
        });
    },
    error: function(xhr) {
      alert("error");
    }
});
}
    • 我的控制器操作方法:**
[HttpPost]
public FileResult DisplayResult(string Html)
{
    return null;
}

我在网上搜索了一下,找到了几个相关的帖子,但那些都在谈论不同的解决方案,比如使用Html.Beginform()和提交按钮-但这些解决方案都不适合我的需要。

wlzqhblo

wlzqhblo1#

你有javascript错误,你的调用是错误的,你将需要字符串化的数据。

function abc() {
        var html = $("#div").html();
        var dataToSend = JSON.stringify({ 'Html': html });
    
        $.ajax({
            url: '/Home/DisplayResult', //
            data: dataToSend,
            type: "POST",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                //do something
    },
    error: function(xhr) {
        alert("error");
    }
    });
    }

我在HomeController中有这样的功能:

[HttpPost]
    public FileResult DisplayResult(string Html)
    {
        return null;
    }
qnyhuwrf

qnyhuwrf2#

发送Html内容是不安全的,所以你会得到一个错误。虽然你可以绕过这个错误,禁用输入验证,但不建议:

[ValidateInput(false)]
public class YouController: Controller{

}
xpszyzbs

xpszyzbs3#

也许内容类型是错误的,但是您可以从浏览器内部检查错误(使用网络选项卡并单击您的请求,或者甚至使用fiddler)
在不测试代码的情况下,我不能说太多,但另一个选项是检查error函数的responseText,如下所示:

error: function(xhr, status, error) {
  alert(err.responseText);
}
j13ufse2

j13ufse24#

如果在contentType中定义了“application/json”,则必须在stringify操作后发送。

$.ajax({
    url: '@Url.Action("DisplayResult", "Default")', //
    data: JSON.stringify(data),
    type: "POST",
    contentType: "application/json; charset=utf-8",
    success: function(result) {
      //do something
    });
},
error: function(xhr) {
  alert("error");
}

如果您没有定义“application/json”,默认的contentType是“application/x-www-form-urlencoded”,您可以不使用JSON. stringify将该对象传递给数据参数。

slwdgvem

slwdgvem5#

感谢您的回复!
我通过添加一个带有[AllowHtml]属性的字符串属性并通过模型传递我的html来解决这个问题。
然而,由于一些用户回应说传递html是不安全的,所以我在我的控制器中编写了一个方法来生成相同的html。再次感谢您的回答!

cvxl0en2

cvxl0en26#

Just before the ajax call

data = {
    Html: encodeURIComponent(html)
};

Then once back at the controller

[HttpPost]
public FileResult DisplayResult(string Html)
{
   Html = HttpUtility.UrlDecode(Html); 
   return null;
}

This took care of the problem for me

相关问题