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 точно соответствует именам параметров ваших контроллеров.