Je développe une application utilisant asp.net, mvc6 et angularjs sur mon service angulaire. Lorsque je fais une demande à une méthode d'action, je ne reçois aucune donnée passée . Après avoir vérifié la demande, une exception provoquée par:
- Form '((Microsoft.AspNet.Http.Internal.DefaultHttpRequest) this.Request) .Form' jeté une exception de type 'System.InvalidOperationException' Microsoft.AspNet.Http.IFormCollection {System.InvalidOperationException}
message d'exception disant "Incorrect Content-Type:application/json;charset=UTF-8"
mon service angulaire
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);
});
sur mon contrôleur
[HttpPost]
public IActionResult CreateEvent([FromBody]Event eventDetails)
{
return Json(new {dsd=""},
new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});
}
J'espère que les exemples suivants vous aideront.
Essayez de décorer votre contrôleur avec
[Produces("application/json")]
[Route("api/[controller]")]
Puisque vous ne montrez pas le nom de votre contrôleur, je vais vous donner un exemple de travail fictif.
[Produces("application/json")]
[Route("api/[controller]")]
public class DashBoardLayoutApi : Controller
{
public DashBoardLayoutApi()
{ }
[HttpPost]
public void Post([FromBody] LoginViewModel data)
{ }
}
public class LoginViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
<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>
La réponse acceptée n'a pas fonctionné pour moi. Pour moi, la solution a été d’ajouter un en-tête à l’appel $ http:
$http({
url: "/install",
method: "POST",
data: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})
.success(...);
Dans mon cas, ajouter [Produces("application/json")]
n'a rien fait, mais ajouter l'attribut [FromBody]
au paramètre est ce qui a fait l'affaire!
La réponse cachée est géniale. Cependant, j'avais toujours un modèle vide dans le contrôleur C #, même après avoir implémenté l'approche de hidden dans mon application. Après avoir fouillé un peu, j'ai constaté que le problème était lié à un modèle client incorrect créé en code JS, qui ne peut pas être désérialisé sur le serveur (la valeur null ne peut pas être convertie en type Guid).
Pour une raison quelconque, le classeur de modèles ne génère pas d'exceptions dans de tels cas: https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/model-binding
Lorsqu'un paramètre est lié, la liaison de modèle cesse de rechercher des valeurs portant ce nom et continue pour lier le paramètre suivant. Si la liaison échoue, MVC ne génère pas d'erreur. Vous pouvez rechercher des erreurs d'état du modèle en vérifiant la propriété ModelState.IsValid.
Vérifiez donc la propriété ModelState.IsValid dans le contrôleur C # pour vous assurer que vous avez transmis un modèle valide et envisagez peut-être d'utiliser un classeur de modèle personnalisé pour intercepter les erreurs de liaison de modèle et les consigner.