Проводка JSON на apicontroller
Я борюсь с "новым" WebApi в Asp.Net...
Я просто хочу опубликовать Json, но это не десериализация моих данных... что я делаю неправильно?!
Класс контроллера
public class UtilityController : ApiController
{
[HttpPost]
public string Bla(Bla bla)
{
return "bla";
}
}
Класс Bla:
public class Bla
{
public string Een { get; set; }
public string Twee { get; set; }
}
Api config:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{Action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Отправленные данные:
var bla = $.parseJSON('{"Een":"UNO","Twee":"DUE"}');
$.ajax({
type: "POST",
url: "/api/utility/Bla",
data: {Bla : bla},
dataType: "json"
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
Ответы
Ответ 1
что я делаю неправильно!
Вы не отправляете запрос JSON. Вы отправляете запрос application/x-www-form-urlencoded
.
Поэтому убедитесь, что вы отправляете настоящий запрос JSON:
var bla = { "Een": "UNO", "Twee": "DUE"};
$.ajax({
type: 'POST',
url: '/api/utility/Bla',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(bla),
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
Обратите внимание, как я установил правильный заголовок contentType
на application/json
, как я использовал метод JSON.stringify
для отправки реального запроса JSON и как я избавился от бесполезного параметра dataType: 'json'
, который jQuery отлично способен автоматически выводить из заголовка ответа Content-Type, который отправляет сервер.
Ответ 2
Параметр bla
может быть помечен тегом [ModelBinder]
в методе Post:
[HttpPost]
public string Bla([ModelBinder]Bla bla)
{
return "bla";
}
Ответ 3
Можете ли вы попробовать изменить эту строку:
data: {Bla : bla},
Для этого:
data: bla,