2015-11-14 16 views
13

Zajmuję się tworzeniem aplikacji przy użyciu asp.net, mvc6 i angularjs na mojej usługi kątowej. Kiedy wysyłam żądanie do metody akcji, nie otrzymuję żadnych przekazanych danych. Kiedy sprawdzeniu żądanie, można zobaczyć, że wyjątek, że wywołane:"Nieprawidłowy Content-Type:" wyjątek wyrzuca program kątowy mvc 6

  • Forma '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest) this.Request) .Form' zwrócił wyjątek typu 'System.InvalidOperationException' Microsoft.AspNet.Http.IFormCollection {System.InvalidOperationException}

wiadomość wyjątek mówiąc "Incorrect Content-Type:application/json;charset=UTF-8"

mój kanciasty serwis

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); 
       }); 

na moim kontrolera

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

} 
+0

Jakieś ulepszenie w tej sprawie? –

+1

nope ale to działało 'var eventObj = JsonConvert.DeserializeObject (Request.Form [ "wydarzenie"]);' angule serwis wrócił '$ http ({url: ' Home/CreateEvent', metoda: "POST" , dane: $ .param ({ wydarzenie: JSON.stringify (event) }), nagłówki: { 'Content-Type': 'application/x-www-form-urlencoded'} }) sukces (. deffered.resolve) .error (deffered.reject); ' – Gayan

Odpowiedz

2

nadzieję, że poniższe przykłady pomaga.

Spróbuj ozdobić swój kontroler z

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

Ponieważ din't pokazać swoją nazwę kontrolera dam ci fikcyjnej pełny przykład roboczych

kontrolera

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

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

C# 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> 

Wyniki

enter image description here enter image description here

+0

Złożone obiekty również działają. I.E .: Publiczna klasa LoginViewModel { public string Email {get; zestaw; } public string Hasło {get; zestaw; } Publiczna lista MyOtherViewModel {get; set} } Dopóki twój obiekt Js ma tę samą nazwę właściwości i atrybuty mają tę samą nazwę. Dane var = { Email: 'test', hasło: 'test', Twój na zawsze: true MyOtherViewModel: [{PropertyName: "cokolwiek"}, {PropertyName: Whatever2}, {PropertyName: "somethingelse"}] } ; – hidden

3

Przyjęte rozwiązanie nie działa dla mnie. Dla mnie rozwiązaniem było dodanie nagłówka do wywołania $ http:

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

Jak to możliwe, że to nie działa, nawet zrobiłem zrzuty ekranu wyniku ... – hidden

0

Odpowiedź ukrytego jest świetna. Jednak nadal miałem pusty model w kontrolerze C#, nawet po tym, jak zaimplementowałem podejście ukryte w mojej aplikacji. Po drobnym wykopaniu odkryłem, że problem dotyczył nieprawidłowego modelu klienta utworzonego w kodzie JS, którego nie można przekształcić na serwer z postaci szeregowej (null nie może zostać przekonwertowany na typ Guid).

Z jakiegoś powodu, model spoiwo nie rzucać wyjątków w takich przypadkach: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

Gdy parametr jest związany, model wiążący przystanki poszukuje wartości z tą nazwą i przechodzi do związania następnego parametru . Jeśli powiązanie nie powiedzie się, MVC nie zgłasza błędu. Można zapytać o błędy stanu modelu, sprawdzając właściwość ModelState.IsValid.

więc sprawdzić właściwość ModelState.IsValid w kontrolerze C#, aby upewnić się, że przeszedł poprawny model i może rozważyć użycie niestandardowych spinacza modelu złapać modelu błędów wiążących i ich zalogować.

Powiązane problemy