Проводка 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,