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 :

[Razor] Passage de paramètres depuis la vue au controller


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut [Razor] Passage de paramètres depuis la vue au controller
    Bonjour à tous,

    Aujourd'hui j'ai attaqué le rendu de mon appli web MVC3 avec Razor, mon modèle me semble un peu branlant mais bon, ça marche. Donc j'ai une question simple, j'ai ma vue fortement typée qui prend un objet Demande. Cette objet est une instance de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Demande
        {
            public int DemandeId { get; set; }
            public string Titre { get; set; }
             ...
            public int VendeurID { get; set; }
            public int? ResponsableID { get; set; }
     
            public virtual Vendeur Vendeur { get; set; }
            public virtual Responsable Responsable { get; set; }
     
        }
    Donc je propose l'édition de cette demande, donc j'utilise les @Html.EditorFor(model => model.Titre) par exemple. Si j'ai bien compris, cela envoi juste le model au controller (en l'occurence, ici ma demande) donc pas de probleme quand il s'agit de recuperer des données de la table Demande. Mais dans ce modèle, j'ai aussi un Responsable et un Vendeur. Je souhaite modifier le nom du responsable, j'ai naturellement fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Html.EditorFor(model => model.Responsable.Nom)
    Donc en théorie, je pensais recuperer le nom du responsable. Mais dans mon controller, j'ai:
    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
    23
    24
    25
    26
     
     [HttpPost]
            public ActionResult Accepter(Demande demandeModifiee)
            {
     
                //on recupere le responsable et on change son nom, le cas échéant
                Responsable responsable =db.Responsables.Find(demandeModifiee.ResponsableID);
                responsable.Nom = demandeModifiee.Responsable.Nom;
     
                db.Entry(responsable).State = EntityState.Modified;
                //on recupere le vendeur
                Vendeur vendeur = db.Vendeurs.Find(demandeModifiee.VendeurID);
                demandeModifiee.Vendeur = vendeur;
                //changement de l'etat à "pris en charge"
                demandeModifiee.EtatValue = 1;
     
                    db.Entry(demandeModifiee).State = EntityState.Modified;
                    db.SaveChanges();
     
                    ViewBag.responsable = demandeModifiee.Responsable.Nom;
     
     
                ViewBag.acceptation = true;
     
                return View(demandeModifiee);
            }
    J'ai bidouillé un peu , mais au debut, je pensais naivement que le framework allait m'updater les tables en cascade(...enfin qu'il allait me mettre a jour tout seul le Demande.Responsable.Nom,ce qui revient à modifier dans la table Responsable la ligne d'ID egale à celle présente dans la demande.). Or il me jette avec l'erreur:
    {"Object reference not set to an instance of an object."}
    Peut etre me manque t'il une relation dans ma base?

    Donc j'avais mis en champs caché les ID des responsables et vendeurs pour ensuite récupérer les 2 objets dans le controller avec la method find() et les remettre dans ma demande. Mais j'aurais forcement à un moment besoin de modifier les objets vendeurs et responsables. Donc je me demandais comment faire, enlever le type de la vue? Sinon j'avais pensé récupérer un champ quelconque de type string qui contiendrait le nouveau nom mais je ne sais pas comment passer un champ qui n'appartient pas à l'objet Demande depuis la vue vers le controller.

    Merci d'eclairer mes lumieres sur le passage de parametre dans razor,

    Bonne journée

  2. #2
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    C'est pas une question piege On m'a dit qu'il existait une Data Annotation [include] qu'on peut ajouter au modèle au dessus de la propriété de navigation vers l'objet auquel on veux accedé (dans le cas ci-dessus, ce serait dans Demande, devant l'attribut Responsable) Mais visual studio refuse de le voir...peut etre manque t'il une directive.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut Partiellement résolu
    Bonjour,
    Apres 2 jours, j'ai finalement bricolé, j'ai ajouté dans ma vue le input qui renvoi un Id du responsable selectionné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       <select name="IdResponsable">
                     @foreach(var item in ViewBag.Responsables ){
                         <option value="@item.UserId">@item.Nom</option>
                     }
           </select>
    Ce qui recupere tout les responsables de ma base dans une dropbacklist. Je l'ai ecrite en HTML, j'ai pas pris le temps de trouver la doc pour @dropbacklist. Et dans mon controller je récupère en plus de mon objet Responsable, un int du meme nom que mon select:
    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
    23
     
     
    public ActionResult Accepter(Demande demandeModifiee, int IdResponsable)
            {
     
                //on recupere le responsable.
                Responsable responsable = db.Responsables.Find(IdResponsable);
                //on affecte le responsable à la demande
                demandeModifiee.ResponsableID = responsable.UserId;
                db.Entry(responsable).State = EntityState.Modified;
                db.SaveChanges();  
                //on recupere le vendeur
                Vendeur vendeur = db.Vendeurs.Find(demandeModifiee.VendeurID);
                demandeModifiee.Vendeur = vendeur;
                //changement de l'etat à "pris en charge"
                demandeModifiee.EtatValue = 1;
                    db.Entry(demandeModifiee).State = EntityState.Modified;
                    db.SaveChanges();                
     
                ViewBag.acceptation = true;
     
                return View(demandeModifiee);
            }
    Donc pour recuperer un champs exterieur à un objet, il faut lui mettre un nom et dans les parametres de l'action du controller, il faut recuperer une variable de meme type que ce champs.

    Bonne soirée

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 27
    Points : 54
    Points
    54
    Par défaut
    Salut,

    Tu trouveras une piste de solution adaptée à ton problème ici:
    (Voir le post concernant DropDownListFor)
    http://www.developpez.net/forums/d10...e-aspnet-mvc3/

  5. #5
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Effectivement, j'ai intégré la dropDownList et je connaissais pas la méthode Single(). Sinon,avec les propriétés de navigation, on peut récupérer les valeurs des champs d'autres tables liées , mais on ne peut apparemment pas les updater directement...enfin moi j'ai pas réussi.

    Merci pour les infos

Discussions similaires

  1. [Toutes versions] [Tutoriel] Passage de paramètres depuis Batch vers Excel
    Par Jean-Philippe André dans le forum Excel
    Réponses: 9
    Dernier message: 08/06/2020, 16h55
  2. Passage de paramètres depuis une ligne de commande DOS
    Par vince_lille dans le forum Sql*Plus
    Réponses: 4
    Dernier message: 21/10/2011, 16h07
  3. Réponses: 10
    Dernier message: 03/12/2009, 21h45
  4. Passage de paramètre depuis Access vers Excel
    Par funkyjul dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/10/2008, 09h43

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