Sri
Sri

Reputation: 31

Pass Html string from view to controller via ajax call

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.

Upvotes: 1

Views: 8773

Answers (6)

Sasho Ristovski
Sasho Ristovski

Reputation: 147

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

Upvotes: 2

Timothy Power
Timothy Power

Reputation: 9

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

Upvotes: 1

Sri
Sri

Reputation: 31

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!

Upvotes: 0

Django
Django

Reputation: 222

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.

Upvotes: 0

LeviTheOne
LeviTheOne

Reputation: 105

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

Upvotes: 0

Ashkan Mobayen Khiabani
Ashkan Mobayen Khiabani

Reputation: 34152

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{

}

Upvotes: 1

Related Questions