1

I have a requirement where I need to pass all the HTML of a div tag to the controller. I am able to get the HTML, but code fails when I am passing HTML via ajax.

Here's my code.

View:

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

My controller Action method:

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

I searched online and found a couple of related posts, but those were talking about different solutions like using Html.Beginform() and submit buttons - but none of those solutions suit my need.

Sri
  • 31
  • 2
  • 8
  • Do you get an error from MVC when you try to run the code? – just.another.programmer Sep 06 '18 at 19:52
  • my code doesn't hit the controller , javascript fails! – Sri Sep 06 '18 at 19:53
  • What error do you get from javascript? (You can open the console to view the error message) – just.another.programmer Sep 06 '18 at 19:55
  • its a 500 internal server error in my console. Breakpoint in my controller is never hit. However, if I dont pass any data in ajax (just pass null) and make the parameter in my controller optional, there's no problem. So, I am assuming something is going wrong when I am passing the html ? – Sri Sep 06 '18 at 20:00
  • You need to check the text returned along with the 500. It probably says you sent a potentially dangerous request. See [this](https://stackoverflow.com/q/81991/794234) for more info. – just.another.programmer Sep 06 '18 at 20:04

6 Answers6

2

You have javascript errors and your call is wrong you will need to stringify the data.

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

And I have this in HomeController:

[HttpPost]
public FileResult DisplayResult(string Html)
{
  return null;
}
Tyler2P
  • 2,324
  • 26
  • 22
  • 31
Sasho Ristovski
  • 147
  • 1
  • 7
  • You will need to stringify your html – Sasho Ristovski Sep 06 '18 at 20:28
  • in the last 10 years of using JQuery functions, I have never seen such a confident rude and incorrect statement. You most certainly do NOT need to "stringify" objects before posting them via jquery. – Lemiarty Jun 08 '22 at 20:01
1

Sending Html content is not safe so you will get an error. although you can bypass this error, disabling input validation but it's not recommended:

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

}
Ashkan Mobayen Khiabani
  • 33,575
  • 33
  • 102
  • 171
1

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

Tyler2P
  • 2,324
  • 26
  • 22
  • 31
0

maybe the Content type is wrong, but you can check the error from inside a browser (using the Network tab and clicking your request, or even with fiddler)

I can't say much without testing the code, but another option would be to check the responseText of the error function like :

error: function(xhr, status, error) {
  alert(err.responseText);
}
LeviTheOne
  • 105
  • 9
0

If you define "application/json" in contentType, you must send it after stringify operation.

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

If you don't define "application/json", the default contentType is "application/x-www-form-urlencoded", which you can pass the object to data parameter without JSON.stringify.

Django
  • 222
  • 1
  • 5
0

Thanks for your responses!

I was able to solve this problem by adding a string property with [AllowHtml] attribute and passing my html via model.

However, since some of the users responded that it's not safe to pass html, I wrote a method in my controller to generate the same html. Thanks for your answers again!

Sri
  • 31
  • 2
  • 8