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 Discussion :

[MVC] Impossible de faire passer une donnée en ViewData vers un Create (Post)


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut [MVC] Impossible de faire passer une donnée en ViewData vers un Create (Post)
    Bonsoir,

    J'ai un petit soucis avec le passage de données par ViewData de ma vue vers mon contrôleur.

    Le problème est tout simple: il ne me trouve pas la valeur dans le ViewData que j'essaye de récupérer. Apparemment, je ne dois pas être en mesure de passer un ViewData de ma vue vers mon contrôleur (l'inverse est par contre possible).

    Est-ce que quelqu'un à une solution pour le passage de valeur d'une vue vers un controlleurs avec le framework MVC?

    Merci bien et bonne soirée ; )

    L.

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Salut,

    normalement, tu te bases sur le contenu de la formcollection ou de l'objet que tu passes à ton action.

    Je ne vois pas forcément ce que tu veux faire, peut-être que tu peux nous donner un exemple ?

  3. #3
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Salut,

    Pour l'exemple c'est tout simple: je souhaite récupérer ma valeur de mon ViewData pour pouvoir l'insérer dans ma base de donnée, en tant que clé de valeur étrangère.

    Voici le code histoire que ça soit plus parlant :

    Les méthodes create de mon controlleur:

    Code C# : 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
    27
    28
    29
    30
    31
    32
    33
    34
            //
            // GET: /Question/Create
    
            // id is the current domain id of the questions
            public ActionResult Create(int id)
            {
                ViewData["DomainID"] = id;
                return View();
            } 
    
            //
            // POST: /Question/Create
    
            [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult Create(Models.Questions _question, FormCollection collection)
            {
                if (ModelState.IsValid)
                {
                    try
                    {
                        int id2;
                        Int32.TryParse((String)ViewData["DomainID2"], out id2);
                        Models.Question newQuestion = new Question();
                        newQuestion.AddQuestion(_question.que_name, _question.que_ponderation, id2);
                        return RedirectToAction("Index");
                    }
                    catch (Exception e)
                    {
                        return View();
                    }
                }
                return View("Create");
            }

    Ma vue correspondante:

    Code C# : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    	Create
    </asp:Content>
     
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
     
        <h2>Create</h2>
     
        <%= Html.ValidationSummary("La création a échouée. Veuillez s'il vous plaît remplir correctement les champs nécessaire.")%>
     
        <% using (Html.BeginForm()) {%>
     
            <fieldset>
                <legend>Cr&eacute;er une nouvelle question</legend>
                <p>
                    <label for="que_name">Question:</label>
                    <%= Html.TextArea("que_name", null, 10, 108, null)%>
                    <%= Html.ValidationMessage("que_name", "*") %>
                </p>
                <p>
                    <label for="que_ponderation">Pond&eacute;ration</label>
                    <%= Html.TextBox("que_ponderation") %>
                    <%= Html.ValidationMessage("que_ponderation", "*") %>
                </p>
                <p>
                    <input type="submit" value="Créer" />
                </p>
                <input type="hidden" id="DomainID2" value="<%= Html.Encode((int)ViewData["DomainID"]) %>" />
            </fieldset>
     
        <% } %>
     
     
        <div>
            <%= Html.ActionLink(Html.Encode("Retourner à la liste des questions"), "Index", "Question", new { id = ViewData["DomainID"] }, null )%>
     
        </div>
     
    </asp:Content>

    En rouge dans le controlleur c'est le morceau de code qui me renvoit 0 à la place de la bonne valeur.

    Je ne sais pas s'il y a une manière de faire différente qui permet de ne pas avoir à faire ce genre de chose? Ou est-ce que ce n'est pas normal que je rencontre ce genre de problème?

    Le soucis c'est que j'ai besoin de récupérer cette valeur, et que c'est un peu la seul façon que j'ai trouvé de garder cette valeur en ce baladant dans les vues et controlleurs en fonction de notre navigation dans l'application : /

  4. #4
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Est-ce que DomainID2 fait partie de ton objet Models.Questions ?

    Si oui, je ferais qq chose comme ca (avec une vue fortement typée sur Models.Questions) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public ActionResult Create(int id){
      return View(new Models.Questions { DomainID2 = id });
    } 
     
    [HttpPost]
    public ActionResult Create([Bind(Exclude = "Id")] Models.Questions _question){
      new Question().AddQuestion(_question.que_name,_question.que_ponderation, _question.DomainID2);
      return RedirectToAction("Index");
    }
    Chez moi, en tout cas, ca marche

    Sinon, question bête, tu as bien vérifié que ton champ caché DomainID2 avait bien une valeur coté client ?

  5. #5
    Membre habitué
    Inscrit en
    Mai 2006
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 397
    Points : 130
    Points
    130
    Par défaut
    Je viens de régler le problème!

    En faite, j'ai inséré dans mon formulaire de ma vue le code suivant:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <%= Html.Hidden("DomainID2", Html.Encode((int)ViewData["DomainID"]))  %>

    Du coup, je peux le récupérer en utilisant le paramètre FormCollection qui est passé à ma méthode

    Je ne sais pas si c'est la solution la plus propre, mais au moins j'utilise les HTML helper qui sont proposé par le framework ^^

    Edit: oui mon champ a bien une valeur, le soucis était vraiment de faire passer la valeur de la vue au controlleur. Mais avec les HTML helper, apparement ça gère très bien via les FormCollection qui sont passé au méthode Post ^^

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

Discussions similaires

  1. Impossible de faire passer mon DataContext ! Une idée ?
    Par Cvbdev dans le forum Windows Communication Foundation
    Réponses: 4
    Dernier message: 07/02/2010, 23h30
  2. Faire passer une table en paramètre pour une procedure
    Par samplaid dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/02/2006, 11h26
  3. [Debutant] comment faire passer des donnée ???
    Par cyrill.gremaud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/01/2006, 22h28
  4. faire passer une variable d'une fct js à une page php
    Par harlock59 dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 14h41
  5. Réponses: 10
    Dernier message: 21/04/2005, 10h00

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