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 :

[ASP.NET MVC] Passage de plusieurs paramètres d'une Vue à un Controller


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 [ASP.NET MVC] Passage de plusieurs paramètres d'une Vue à un Controller
    Bonsoir,

    J'ai un petit soucis actuellement en utilisant le framework ASP.NET MVC.

    Je m'explique:

    J'ai une vue de type Create. Sur cette vue, je demande de rentrer 2 choses (du texte). Lorsque j'appuye le bouton submit, il y a donc le type définit qui est passé à la méthode en HTTPVerbs.Post, jusque là tout va bien.

    Dans cette méthode Create, j'aimerais récupérer une variable que j'ai passé (ou du moins essayé) via ViewData["MaVar"], sauf que cela ne marche pas! J'obtiens l'erreur:

    "Object reference not set to an instance of an object."
    Est-ce que quelqu'un sait si on peut faire ce genre d'opération? Et sinon, comment faire pour contourner le problème? (sachant que j'ai vraiment besoin de cette variable pour avoir l'ID de la table parent, ceci pour avoir la bonne clé étrangère dans la table enfant dans la clé étrangère)

    Merci d'avance 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
    Normalement, oui, c'est possible...


    Dans cette méthode Create, j'aimerais récupérer une variable que j'ai passé (ou du moins essayé) via ViewData["MaVar"], sauf que cela ne marche pas! J'obtiens l'erreur:
    A quel endroit as-tu passe MaVar dans le ViewData ? Si c'est dans le controlleur du Create qui est appele pour le GET, c'est normal, si tu ne l'as pas re-utilise dans ta vue

    Apres, est-ce que tu faire voir le code que tu as ecrit ?

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 38
    Points : 50
    Points
    50
    Par défaut
    elle est bizarre ta question

    mais ce que je comprend c'est que tu veux passer une donnée d'une vue au controller .
    soit tu peux rajouter un input type hidden avec comme nom le nom de ta variable et comme value sa valeur et tu peux la recuperer , en declarant une
    string mavar dans les parametre de la methode create

  4. #4
    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
    Désolé pour ma réponse tardive, j'ai pas mal de boulot ces derniers temps du coup même le week-end je ne susi pas tranquil : (


    Voici le code là ou ça plante:

    Mon controler Create:

    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
    27
    28
    29
     
    // 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)
            {
                if (ModelState.IsValid)
                {
                    try
                    {
                        Models.Question newQuestion = new Question();
                        newQuestion.AddQuestion(_question.que_name, _question.que_ponderation, (int)ViewData["DomainID2"]);
                        return RedirectToAction("Index");
                    }
                    catch (Exception e)
                    {
                        return View();
                    }
                }
                return View("Create");
            }
    Et ma vue:
    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
    27
    28
    29
    30
    31
    32
    33
    34
     
    <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><% ViewData["DomainID2"] = ViewData["DomainID"]; %>
                    <input type="submit" value="Créer" />
                </p>
            </fieldset>
     
        <% } %>
     
        <div>
            <%= Html.ActionLink(Html.Encode("Retourner à la liste des questions"), "Index", "Question", new { id = ViewData["DomainID"] }, null )%>
     
        </div>
     
    </asp:Content>
    Je pensais qu'on pouvait récupérer comme ça une variable ViewData, mais je n'y arrive pas :/ si vous connaissez un autre moyen de passer plusieurs paramètres d'une vue à un controlleur et vice-versa, je suis preneur de l'info parce que là je galère

    Bonne soirée : )

  5. #5
    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
    La, comme ca, à cette here avancée et sans pouvoir tester, je dirais que ca vaudrait le coup de tester d'jaouter un chqmp caché, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <input type="hidden" name="DomainID2" value="<%= Html.Encode(ViewData["DomainID"]) %>" />
    et de changer le contrôleur comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Models.Questions _question, FormCollection collection){
    Pas testé, pas de garantie, mais je le sens bien

  6. #6
    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
    Mhh ok je testerais.

    Par contre c'est pas top ça d'avoir un champ comme ça caché non? Si on me le modifie, ça peut être sacrément chiant puisque ça insérerait une nouvelle question avec une référence érronnée

    Enfin, je dis ça en partant du principe qu'une interception est possible (via un proxy par exemple) et qu'une modification soit faite sur un champ caché.

    Je pensais qu'il y avait un moyen plus "propre" de faire passer plusieurs variables d'une vue à un contrôleur mais apparement pas

  7. #7
    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
    J'ai un petit soucis par contre, je ne sais pas comment récupérer le DomainID2 de mon champ caché depuis mon FormCollection :s Je n'ai pas trouvé de piste que me permette de sélectionner mon champ caché (soit parce que ce n'est pas correcte ou pris en charge par l'IntelliSense)

    Sinon, il ne faudrait pas seter un "id" à la place du "name" ?

  8. #8
    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
    tu fais :
    string id2 = collection["DomainID2"];
    Pour l'id/name, je ne sais plus sur lequel le moteur se base (id ou name), dans le doute, mets les deux

  9. #9
    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
    Ok merci, je vais voir ce que ça donne : )

    edit: le deuxième soucis, c'est que ce n'est pas possible de convertir un string en int, même en typant avec int (enfin, je suis pas sur que ça s'appel comme cela mais j'ai fais (int)collection["DomainID2"]) : /

  10. #10
    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
    Essaye avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int id2 = 0;
    Int32.TryParse (collection["DomainID2"], out id2);


  11. #11
    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
    Alors j'ai essayé, mais malheureusement ça ne marche pas la solution du champ caché. Dans le FormCollection, il ne prend que les champs suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <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>
    Puisque quand j'observe la variable on ne voit que les deux valeurs que_name et que_ponderation :/ Mon expérience étant limitée, je ne sais pas trop qu'est-ce qui pourrait marcher ... si tu as d'autres idées je suis preneur

    C'est quand même dingue qu'il n'y ait pas une façon "élégante" de faire ça non?

    Edit:

    J'ai également un message d'erreur à l'éxecution lorsque j'arrive sur ma partie de code dont je bloque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Server Error in '/' Application.
    Object reference not set to an instance of an object.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
     
    Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
     
    Source Error:
     
    Line 31: 
    Line 32:     <% } %>
    Line 33:     <input type="hidden" id="DomainID2" value="<%= Html.Encode((int)ViewData["DomainID"]) %>" />
    Line 34: 
    Line 35:     <div>
    Du coup, c'est bizarre parce qu'on dirait qu'il ne m'encode par ce qu'il y a dans DomainID...

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2015, 02h28
  2. Réponses: 8
    Dernier message: 15/09/2010, 09h52
  3. Réponses: 13
    Dernier message: 04/03/2010, 00h30
  4. Réponses: 2
    Dernier message: 09/08/2006, 04h13
  5. [CR][ASP.NET] Un champ avec plusieurs polices...
    Par David.V dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 08/04/2004, 15h19

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