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 :

Posté un objet depuis une liste


Sujet :

ASP.NET MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut Posté un objet depuis une liste
    Bonjour,

    Je rencontre un souci lors d'un POST vers l'action de mon contrôleur.

    J'ai donc :
    Une vue partielle utilisant un modèle de type "List<MonObjet>", et à l'intérieur, une itération sur ce modèle.

    Le modèle "MonObjet" possède une vue "MonObject.cshtml" dans le "~/Shared/EditorTemplates" afin que je puisse, depuis ma première vue partielle faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.EditorFor(x => x)
    Ou avec une itération en "for()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.Editor(x => x[i])
    Ca tourne sur le rendu, pas de problème.

    Passons à la vue typée "MonObjet" :
    Elle contient un formulaire HTML déclaré comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.BeginForm("MonAction", "MonCtrl", FormMethod.Post, new { @id = "form-[id-unique-mon-objet]"})
    En fin de form, j'ai placé un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <button type="submit" />
    Au rendu, l'ensemble de mes champs de formulaire sont bien bindés correctement avec une notation comme celle-ci :
    Etant donné que mes champs sont bindés en mode "list", mais que je submit le formulaire "individuellement", c'est là que je rencontre des soucis. Pour que mon controller réceptionne correctement les données, je le déclare non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ActionResult MonAction(MonObject obj)
    Mais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ActionResult MonAction(List<MonObject> obj)
    Quand je traite le premier élément de ma page (renseignement du form + validation submit), pas de souci, ma liste comporte bien un seul élément, je fais alors
    Pour obtenir mes données postées.

    Quand je tente de traiter un autre élément que le premier, mon modèle envoyé est null.

    Le problème vient alors du fait que l'objet envoyé est serialisé comme cela :
    [x].Propriete&[x].AutreProp ...

    Alors que le premier élément est bien :
    [0].Propriete&[0].AutreProp ...

    J'ai bien l'impression que le controlleur n'arrive pas à interpréter cela comme une liste étant donné qu'il "manque" des données (omission des index de [0] a [x-1] dans la serialisation des données de formulaire).

    Mais du coup, comment je peux avoir une liste de formulaire "identiques" (même modèle) avec pour chacun, une validation individuelle ?

    Je précise aussi que j'ai une fonction JS pour le post de données avec ceci (le tout pour gérer la réponse asynchrone / loading de chargement ... etc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $(document).submit(function(e) {
    e.preventDefault()
    Post(this)
    });
     
    function Post(form) {
    ...
     $.ajax({
            async: true,
            url: $(form).attr('action'),
            type: $(form).attr('method'),
            data: $(form).serialize(),
    ...
    });
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Bon j'ai réussi à avancer sans travailler dessus pendant 24H.

    J'ai d'abord repenser à cette histoire de nommage en liste avec ce préfixe "[x].", en me disant
    "Tiens, si je les enlevais & je tentais de poster un le tout avec au bout ma méthode déclarée comme ceci : "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ActionResult MaFonction(MonObject obj)
    Parce qu'au fond, si le process de Deserialisation n'arrive pas à prendre en compte ma liste "incomplète", il pourra largement prendre en compte un seul objet
    Donc d'abord j'ai pensé à une RegEx pour nettoyer les données sérialisées qui seront envoyées, mais non, plus simple.

    Dans ma première vue partielle contenant mon itération, je l'ai alors remplacé par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(MonOject obj in Model) {
    Html.RenderPartial("mavue", obj);
    }
    Ainsi, la liste est générée sans bind en list, et chaque formulaire se voit attribuer les mêmes id/name de champ puisqu'il n'y a aucune notion de gestion de l'index (à l'inverse d'un for(int i = 0....) ).

    A l'arrivée, quand je poste le tout à mon contrôleur, l'objet est bien complet.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2006, 19h07
  2. [SWING][JList] Réference à un objet depuis une ligne
    Par Invité dans le forum Composants
    Réponses: 12
    Dernier message: 21/02/2006, 10h08
  3. [Swing][JList] Placer un Objet dans une liste
    Par Invité dans le forum Composants
    Réponses: 1
    Dernier message: 17/02/2006, 10h31
  4. Zoom depuis une liste
    Par ranx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 24/08/2005, 11h22
  5. Récupérer un objet d'une liste déroulante
    Par Hell dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/01/2005, 14h59

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