JQuery отправляет null вместо JSON в ASP.NET Web API
Я не могу заставить это работать... У меня на клиенте есть такой jQuery:
$.ajax({
type: "POST",
url: "api/report/reportexists/",
data: JSON.stringify({ "report":reportpath }),
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
И в моем контроллере Web.API у меня есть такой метод:
[HttpPost]
public bool ReportExists( [FromBody]string report )
{
bool exists = File.Exists(report);
return exists;
}
Я просто проверяю, жив ли файл на сервере, и возвращать bool относительно того, делает он это или нет. Строка отчета, которую я отправляю, представляет собой UNC-путь, поэтому путь report выглядит как "\\ some\path".
Я могу запустить script в порядке и нажать точку останова в моем методе ReportExists, но переменная отчета всегда равна нулю.
Что я делаю неправильно?
Я также вижу способ публикации с .post и postJSON. Может быть, я должен использовать один из них? Если да, то каким будет мой формат?
Обновление: Дополнительная подсказка, возможно, если я удалю [FromBody], тогда моя точка останова не получит никакого удара - "Не найден http-ресурс, соответствующий запросу". Примеры, на которые я смотрю, показывают, что [FromBody] не требуется...?
Ответы
Ответ 1
Итак, я нашел проблему и решение. Итак, прежде всего. ContentType не может быть "application/json", он должен быть пустым (по умолчанию я использую application/x-www-form-urlencoded). Хотя кажется, что вы должны SEND json, но без имени в паре значений имен. Использование JSON.stringify также испортит это. Таким образом, полный рабочий код jQuery выглядит следующим образом:
$.ajax({
type: "POST",
url: "api/slideid/reportexists",
data: { "": reportpath },
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
На стороне Web.API вы ДОЛЖНЫ иметь параметр [FromBody] в параметре, но кроме этого это довольно стандартный. Настоящей проблемой (для меня) была почта.
В Fiddler тело запроса выглядело следующим образом: "=% 5C% 5Croot% 5Cdata% 5Creport.html"
Это сообщение действительно имело ответ и связано с этой статьей, которая была также очень полезно.
Ответ 2
jQuery.ajax()
по умолчанию устанавливает для contentType значение application/x-www-form-urlencoded
. Вы можете отправить запрос в application/json
. Кроме того, вы должны отправить свои данные в виде строки и получить привязку модели к параметру report
для вашего метода post:
$.ajax({
type: "POST",
url: "api/report/reportexists/",
contentType: "application/json",
data: JSON.stringify(reportpath),
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
Ответ 3
Это сработало для меня, не было других подходов:
function addProduct() {
var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };
$.ajax({
type: "POST",
url: "../api/products",
async: true,
cache: false,
type: 'POST',
data: product,
dataType: "json",
success: function (result) {
},
error: function (jqXHR, exception) {
alert(exception);
}
});
}
Serverside:
[HttpPost]
public Product[] AddNewProduct([FromBody]Product prod)
{
new List<Product>(products).Add(prod);
return products;
}
Ответ 4
$. должность служила для меня цели. Удалите [FromBody] из webapi и укажите url в параметре url $.post в jQuery-клиенте. Это сработало!
Ответ 5
Если вы используете атрибут MVC FromBody
, связывание MVC рассматривает это как необязательный параметр. Это означает, что вам нужно явно указывать имена параметров, даже если у вас есть только один параметр FromBody
.
Вы должны иметь возможность работать с чем-то простым:
Контроллер:
[HttpPost]
public bool ReportExists( [FromBody]string report )
{
bool exists = File.Exists(report);
return exists;
}
Javascript
$.ajax({
type: "POST",
url: "api/report/reportexists/",
data: { "report":reportpath },
success: function(exists) {
...
Вы должны убедиться, что ваш объект данных в jQuery точно соответствует именам параметров ваших контроллеров.