РЕДАКТИРОВАТЬ : 31/10/2017
Тот же код / подход будет работать и для Asp.Net Core 2.0 . Основное отличие состоит в том, что в ядре asp.net контроллеры веб-API и контроллеры Mvc объединены в одну модель контроллера. Таким образом , ваш тип возвращаемого значения может быть IActionResult
или один из его реализации (Ex: OkObjectResult
)
использование
contentType:"application/json"
Вам нужно использовать JSON.stringify
метод для преобразования его в строку JSON при отправке,
И связыватель модели свяжет данные json с вашим объектом класса.
Приведенный ниже код будет работать нормально (проверено)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
результат
contentType
свойство сообщает серверу, что мы отправляем данные в формате JSON. Поскольку мы отправили структуру данных JSON, привязка к модели произойдет правильно.
Если вы проверите заголовки ajax-запроса, вы увидите, что Content-Type
значение установлено как application/json
.
Если вы не укажете contentType явно, он будет использовать тип контента по умолчанию, который application/x-www-form-urlencoded;
Внесите изменения в ноябрь 2015 года, чтобы устранить другие возможные проблемы, поднятые в комментариях
Проводка сложного объекта
Допустим, у вас есть класс модели сложного представления в качестве параметра метода действия веб-API, подобного этому
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
и ваша конечная точка веб-API как
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
На момент написания этой статьи ASP.NET MVC 6 является последней стабильной версией, а в MVC6 и контроллеры Web API, и контроллеры MVC наследуются от Microsoft.AspNet.Mvc.Controller
базового класса.
Для отправки данных в метод со стороны клиента приведенный ниже код должен работать нормально
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
Привязка моделей работает для некоторых свойств, но не для всех! Зачем ?
Если вы не украшаете параметр метода web api [FromBody]
атрибутом
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
И отправьте модель (необработанный объект javascript, не в формате JSON) без указания значения свойства contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
Привязка модели будет работать для плоских свойств модели, а не для свойств, где тип является сложным / другого типа. В нашем случае Id
и Name
свойства будут правильно привязаны к параметру m
, но Tags
свойство будет пустым списком.
Та же проблема возникнет, если вы используете короткую версию, $.post
которая будет использовать тип содержимого по умолчанию при отправке запроса.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
Работать с POST в webapi может быть сложно! Хотелось бы добавить к уже правильному ответу ..
Особое внимание будет уделено POST, поскольку работа с GET тривиальна. Я не думаю, что многие будут искать решение GET с помощью webapis. В любом случае ..
Если ваш вопрос - В MVC Web Api, как - использовать имена методов пользовательских действий, отличные от общих HTTP-глаголов? - Выполнить несколько постов? - Опубликовать несколько простых типов? - Публиковать сложные типы через JQuery?
Тогда могут помочь следующие решения:
Во-первых, чтобы использовать пользовательские методы действий в веб-API, добавьте маршрут веб-API следующим образом:
И тогда вы можете создавать методы действий, такие как:
Теперь запустите следующий jQuery из консоли браузера
Во-вторых, чтобы выполнить несколько публикаций , просто создайте несколько методов действий и украсьте их атрибутом [HttpPost]. Используйте [ActionName («MyAction»)], чтобы назначить пользовательские имена и т. Д. Придет к jQuery в четвертом пункте ниже
В-третьих, во-первых, размещение нескольких ПРОСТЫХ типов в одном действии невозможно. Более того, существует специальный формат для публикации даже одного простого типа (кроме передачи параметра в строке запроса или стиле REST). Это было то, что заставило меня ударить головой об остальных клиентах (таких как Fiddler и расширение для расширенного REST-клиента Chrome) и охотиться по сети в течение почти 5 часов, когда, в конце концов, следующий URL оказался полезным. Будет ли цитировать соответствующий контент для ссылки может стать мертвым!
PS: Заметили своеобразный синтаксис ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
В любом случае, давайте закончим эту историю. Двигаясь дальше:
В-четвертых, публикация сложных типов с помощью jQuery, ofcourse, $ .ajax () быстро вступит в роль:
Допустим, метод действия принимает объект Person, который имеет идентификатор и имя. Итак, из JavaScript:
И действие будет выглядеть так:
Все вышеперечисленное сработало у меня !! Ура!
источник
Я просто играл с этим и обнаружил довольно странный результат. Скажем, у вас есть открытые свойства в вашем классе в C #, например:
тогда вы должны выполнить трюк JSON.stringify, как предложено Shyju, и назвать его так:
Однако, если вы определяете методы получения и установки в своем классе следующим образом:
тогда вы можете назвать это намного проще:
Это использует заголовок HTTP:
Я не совсем уверен, что здесь происходит, но это выглядит как ошибка (функция?) В рамках. Предположительно, разные методы привязки вызывают разные «адаптеры», и хотя адаптер для application / json один работает с открытыми свойствами, а другой для закодированных данных формы - нет.
Я понятия не имею, что будет считаться лучшей практикой, хотя.
источник
Используйте JSON.stringify (), чтобы получить строку в формате JSON, убедитесь, что при вызове AJAX вы передаете ниже указанные атрибуты:
Ниже приведен код JQuery для выполнения пост-вызова ajax на веб-интерфейсе asp.net:
источник
Убедитесь, что ваша служба WebAPI ожидает строго типизированный объект со структурой, соответствующей JSON, который вы передаете. И убедитесь, что вы записываете JSON, который вы размещаете.
Вот мой JavaScript (с использованием AngluarJS):
А вот и мой контроллер WebAPI:
источник
Следующий код для возврата данных в формате json вместо xml -Web API 2: -
Поместите следующую строку в файл Global.asax
источник
источник
Microsoft привела хороший пример этого:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Сначала подтвердите запрос
и чем использовать сериализованные данные.
Здесь «Статус» - это поле в сложном типе. Сериализация выполняется .NET, об этом не нужно беспокоиться.
источник
1) На стороне клиента вы можете отправить запрос http.post в виде строки, как показано ниже
2) Затем в вашем веб-контроллере API вы можете десериализовать его
3) Ваш класс ApiReceivedListOfObjects должен быть таким, как показано ниже
4) убедитесь, что ваша сериализованная строка (здесь IndexInfo) становится похожей на структуру ниже, чем команда JsonConvert.DeserializeObject на шаге 2
источник