IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

$http.post -> ASP.net MVC 5 Objet instancié dans MVC mais les membres restent vides. [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Salut,

    J'espère que c'est là qu'il faut poster car ça concerne : Ajax, AngularJS et ASP.net MVC 5 Web Api 2.0 et HttpPost.

    Je vous passe les détails mais en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Je crée un objet
    var offre = { Id: -1, UserId: null, Title: $scope.what, Description: ""};
    //Je le poste avec AngularJS
    $http.post("api/HonApi/PostIt", offer).then(onPostOfferSuccess, onPostOfferFailed);
    En step by step, je vois que l'objet offer contient bien les données que je veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            [HttpPost]
            public HttpResponseMessage PostIt(Offer offer)
            {
                HttpResponseMessage toReturn = new HttpResponseMessage(HttpStatusCode.OK);
                // En mettant le point d'arrêt ici
                return toReturn;
            }
    Côté c# j'ai bien une instance de offer mais chacun de ses membres est vide, j'ai vérifié avec fiddler, la trame partant du navigateur contient bien les données.

    Vous comprenez pourquoi ?

    Merci


    [EDIT]
    Salut,

    J'ai ajouté un intercepteur dans le httpbeginrequest, je reçois bien les données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            protected void Application_BeginRequest(object sender,EventArgs e)
            {
                Byte[] inputBytes = new Byte[HttpContext.Current.Request.InputStream.Length];
     
                HttpContext.Current.Request.InputStream.Position = 0;
                HttpContext.Current.Request.InputStream.Read(inputBytes, 0, inputBytes.Length);
     
                string requestString = ASCIIEncoding.ASCII.GetString(inputBytes);
            }
    Donc, le souci ne se trouve pas entre la chaise et le clavier mais bien à l'intérieur d'MVC.

    Un peu d'aide serait la bienvenue...

    Merci

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 119
    Points : 203
    Points
    203
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ah ca s'appel j'ai verse des larmes j'ai perdu mes cheveux pour une virgule !!!! ou un peu plus que la virgule cette fois !

    1 - a priori Le souci est que le binding ne s'effectue pas entre l objet envoyé par ajax et l action du controller web api .
    Pour invistiger ca
    -regardes bien si toutes les propietes de l objet envoyé par Ajax ont la meme casse que celui du model server .
    - apres regarde si t as pas la configuration du JSON formatter qui est elevee pour ton WEB API
    - fait un test dans ton JS en specifiant le content type comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $http({
        cache: false,
        url: "api/HonApi/PostIt",
        method: "POST",
        data: offer,
        headers: {
            'Content-Type': 'application/json'
        }
      })
    ou essaye ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $http({
        cache: false,
        url: "api/HonApi/PostIt",
        method: "POST",
        data: $.param(offer),
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        }
      })
    - Mets un point d'arret dans le begin_request et regarde si l tu recois bien l'objet envoyé par Ajax.



    Et enfin y a pas de raison a ce que ca ne marche pas c est juste un oublie quelqu part que tu vas vite reperer en debuggant

  3. #3
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Dans ma folie capillaire, j'ai même contrôlé le Content Type...
    Merci du conseil, je vais essayer.

    [EDIT 1]
    Bon j'ai changer Offer par Object.
    Je récupère : {{ "Id": 5, "UserId": null, "Title": "c<wxc<wxc", "Description": ""}}
    le double { m'inquiète. Je me demande si mon objet n'est pas encapsulé dans un autre objet par angular...

    [EDIT 2]
    Je crois que ta proposition c'est sous JQuery, moi je suis sous Angular 1.5 qui encapsule le JQuery. L'intellisense ne me propose pas tes membres.
    Je vais voir s'il n'y a pas une config à faire pour $http.

    [EDIT 3]
    Ca ménnnnnneeeeeeve avec MVC 4 WebAPI 1.0 ça fonctionnait NIKEL...

    Pffff ils modernisent, ils compliquent et après, ça ne fonctionne plus !

    [EDIT 4]
    Bon j'ai fait un truc sans doute dégelasse mais ça marche au moins en attendant que vous m'expliquiez le souci...

    Etant donné que j'arrivais à trouver mon objet dans le Request du HttpContext, j'ai créé un model binder.

    Par contre dans le Request de actionContext, rien... J'aimerais bien avoir l'adresse du dealer qui vend l'herbe à troll de celui qui a pondu le MVC 5 car ça doit être de la bonne

    Ca s'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            [HttpPost]
            public HttpResponseMessage PostOffer([ModelBinder(typeof(ModelBinder<Offer>))] Offer offer)
            {
                HttpResponseMessage toReturn = new HttpResponseMessage(HttpStatusCode.OK);
                // Là on fait plein de trucs genre Your stuff here
                return toReturn;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        public class ModelBinder<T> : IModelBinder
        {
            public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
            {
                bool toReturn = true;
                if (bindingContext.ModelType != typeof(T)) {
                    toReturn = false;
                }
     
                var inputBytes = new Byte[HttpContext.Current.Request.InputStream.Length];
                HttpContext.Current.Request.InputStream.Position = 0;
                HttpContext.Current.Request.InputStream.Read(inputBytes, 0, inputBytes.Length);
                string requestString = ASCIIEncoding.ASCII.GetString(inputBytes);
     
                var deserializedModel = JsonConvert.DeserializeObject<T>(requestString);
     
                bindingContext.Model = deserializedModel;
     
                return toReturn;
            }
        }
    C'est la preuve que c'est pas un problème d'angular mais bien de web api sauce MVC5 non ?

    Merci pour vos avis.

    Je ne mets pas résolu car même si ça marche, ça ne me convient pas.

    D’ailleurs pourquoi ne pas ajouter un bouton Contournement trouvé qui cocherait le fil en orange non ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Au hasard ne maîtrisant pas plus que ça MVC fais-tu un Json.stringify de ton objet avant de les transmettre à ton ws ou un $.params ?

    Côté MVC sais-tu si c'est l'ancien sérialiser Json qui est utilisé ou Json.Net (je crois qu'en MVC 5 c'est automatiquement Json.net).

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 119
    Points : 203
    Points
    203
    Billets dans le blog
    1
    Par défaut
    Oh toi alors je viens d essayer le meme exemple que toi sur mon poste et ca marche
    ceci dit t as qnd meme des erreur sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    //Je crée un objet
    var offre = { Id: -1, UserId: null, Title: $scope.what, Description: ""};
    //Je le poste avec AngularJS
    $http.post("api/HonApi/PostIt", offer).then(onPostOfferSuccess, onPostOfferFailed);
    T as definie une variable offre mais tu envoies une autre variable offer ( offre vs offer)
    en suite voici le code qui a marche pour moi
    WEB API
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     public class TestController : ApiController
        {
     
     
            // POST: api/Test
            public void Post([FromBody]Offer value)
            {
     
            }
     
        }
     
     
        public class Offer
        {
            public int Id { get; set; }
            public string UserId { get; set; }
            public string Title { get; set; }
            public string what { get; set; }
            public string Description { get; set; }
        }
    cote client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var app = angular.module("app", []);
     app.controller("appCtrl", function ($scope, $http) {
         $scope.envoyer = function () {
             var offer = { Id: -1, UserId: null, Title: "147", Description: "une description" };
             //Je le poste avec AngularJS
             $http.post("api/test/Post", offer ).then(function (e) { console.log(e) }, function (e) { console.log("error"); console.log(e) });
         }
     
    });
    et je recois tres bien cote server l'objet Offer

  6. #6
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Désolé, c'est en recopiant le texte que j'ai fait l'erreur, c'est juste dans mon code et ça ne fonctionne pas.
    De toutes les façons, si j'avais fait cette erreur, je ne verrais pas passer mes données dans fiddler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var WhatDoYouProposeController = function ($scope, $http, proposeSomethingService) {
        $scope.proposeEvent = function () {
            this.Offer = new Object();
            this.Offer.Id = 5
            this.Offer.UserId = null;
            this.Offer.Title = $scope.what;
            this.Offer.Description= "";
            var postResult = proposeSomethingService.postOffer($http, this.Offer);
        };
    J'avais aussi essayé en notation directe.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Voilà un exemple de post que je fait avec Angular par contre c'est du PhP rest derrière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    dataFactory.editContext = function (data) {
            var urlApi = "/api/user/****.json";
            var url = _urlService + urlApi;
     
            var params = {
                authToken: data.token,
                title: data.title,
                id: data.listId
            };
     
            return $http.post(url, $.param(params), {
                headers: { 'Content-Type': 'application/x-www-form-urlencoded;' }
            });
        };
    Sinon as tu testé l'attribut Frombody comme suggéré précédemment, je me rappel quand j'appelait des WS MVC avec angular je devais souvent faire un JSON.stringify je crois de mon modèle avant de l'envoyer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/11/2007, 10h25
  2. [C#/ASP.net] Evènement sur objet de session
    Par LE NEINDRE dans le forum ASP.NET
    Réponses: 6
    Dernier message: 10/08/2007, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo