Reputation: 31
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
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
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
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
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
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
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