"Неверный тип содержимого:" исключение вызывает angular приложение mvc 6

Я разрабатываю приложение, использующее asp.net, mvc6 и angularjs в моей службе angular. Когда я делаю запрос к методу действия, я не получаю никаких переданных данных. Когда я проверил запрос, я мог увидеть исключение, вызванное:

  • Form '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest) this.Request).Form' бросил исключение типа 'System.InvalidOperationException' Microsoft.AspNet.Http.IFormCollection {System.InvalidOperationException}

сообщение об ошибке "Incorrect Content-Type:application/json;charset=UTF-8"

my angular сервис

return $http({ method: 'POST', url: 'home/createEvent', eventDetails: event })
                .success(function(data, status, headers, config) {
                    return data;
                })
                .catch(function(data, status, headers, config) {
                    console.log(data);
                });

на моем контроллере

[HttpPost]
public IActionResult CreateEvent([FromBody]Event eventDetails)
{
    return Json(new {dsd=""},
        new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});

}

Ответ 1

Надеемся, что следующие примеры помогут вам.

Попробуйте украсить ваш контроллер

[Produces("application/json")]
[Route("api/[controller]")]

Поскольку вы не укажете свое имя контроллера, я дам вам фиктивный полный рабочий пример

контроллер

[Produces("application/json")]
[Route("api/[controller]")]    
public class DashBoardLayoutApi : Controller
{
    public DashBoardLayoutApi()
    { }

    [HttpPost]
    public void Post([FromBody] LoginViewModel data)
    { }
}

С# viewmodel

public class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
}

HTML/JS

<script>
    var data = {
        Email: 'Test',
        Password: 'Test',
        RememberMe: true
    };

    $("#test").click(function() {
        $.ajax({
            url: '/api/DashBoardLayoutApi',
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(data),                   
        });
    }
</script>
<button id="test"> Save Layout</button>

Результаты

введите описание изображения здесь введите описание изображения здесь

Ответ 2

Принятый ответ не помог мне. Для меня решение заключалось в том, чтобы добавить заголовок к вызову $http:

        $http({
                url: "/install",
                method: "POST",
                data: data,
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded"
                }
            })
            .success(...);

Ответ 3

Скрытый ответ велик. Однако у меня все еще была пустая модель в контроллере С#, даже после того, как я применил скрытый подход в своем приложении. После небольшого поиска я обнаружил, что проблема была в неправильной клиентской модели, созданной в JS-коде, которую нельзя десериализовать на сервере (null не может быть преобразован в тип Guid).

По какой-то причине модельное связующее не бросает исключений в таких случаях: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

Когда параметр привязан, привязка к модели перестает искать значения с этим именем, и она переходит к привязке следующего параметра. Если привязка не выполняется, MVC не выдает ошибку. Вы можете запрашивать ошибки состояния модели, проверяя свойство ModelState.IsValid.

Итак, проверьте свойство ModelState.IsValid в контроллере С#, чтобы убедиться, что вы прошли действительную модель и, возможно, рассмотрите возможность использования настраиваемого связующего объекта, чтобы поймать ошибки привязки модели и зарегистрировать их.

Ответ 4

В моем случае добавление [Produces("application/json")] ничего не сделало, но добавление [FromBody] к параметру - вот что [FromBody] !