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 :

Asp Mvc 5 Liste déroulante


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 92
    Points : 33
    Points
    33
    Par défaut Asp Mvc 5 Liste déroulante
    Bonjour,

    Voila je voudrais mettre en place une liste déroulante contenant les catégories...

    Voici mon model :

    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Web;
     
    namespace _03082017_XXX.Models
    {
        public class Article
        {
            public virtual int ArticleId { get; set; }
     
            [Required(ErrorMessage = "La catégorie est obligatoire")]
            public virtual Category Categorie { get; set; }
     
            public virtual ApplicationUser AddBy { get; set; }
     
        }
    }
    Mon controlleurs :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Mvc;
    using _03082017_XXX.Models;
     
    namespace _03082017_XXX.Controllers
    {
        public class ArticlesController : Controller
        {
            private ApplicationDbContext db = new ApplicationDbContext();
     
            // GET: Articles
            public ActionResult Index()
            {
                return View(db.Articles.ToList());
            }
     
            // GET: Articles/Create
            public ActionResult Create()
            {
                var list = db.Categories.ToList()
                            .Select(r => new SelectListItem { Value = r.CategoryId.ToString(), Text = r.CategoryName });
     
                ViewBag.categorie = list;
     
                return View();
            }
     
            // POST: Articles/Create
            // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
            // plus de détails, voir  https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "ArticleId")] Article article)
            {
                if (ModelState.IsValid)
                {
                    db.Articles.Add(article);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(article);
            }
        }
    }
    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
    35
    36
    37
    38
    39
    40
     
    @model _03082017_xxx.Models.Article
     
    @{
        ViewBag.Title = "Create";
    }
     
    <h2>Create</h2>
     
     
    @using (Html.BeginForm("Create", "Articles", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.AntiForgeryToken()
     
        <div class="form-horizontal">
            <h4>Article</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.Categorie, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownListFor(m => m.Categorie, (IEnumerable<SelectListItem>)ViewBag.categorie, new { htmlAttributes = new { @class = "form-control" } })
                </div>
            </div>
     
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }
     
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
     
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
    Voila pour les partis code, je l'ai réduit en enlevant les autres champs, qui pour l'instant ne pose pas de problème...
    Donc quand je clique sur le submit, j'ai mon erreur ErrorMessage = "La catégorie est obligatoire" qui revient... Pourtant ma liste déroulante est rempli avec ce quel contient dans ma table...

    Quelqu'un pourrait m'orienter?

    Merci

  2. #2
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Salut,

    Je pense que ça vient de la déclaration de ta DropDownList :

    Tente de convertir ton IEnumerable en tant que SelectList et mets une valeur par défaut.


    https://stackoverflow.com/questions/...selected-value

    https://stackoverflow.com/questions/...dataannotation

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 92
    Points : 33
    Points
    33
    Par défaut
    Alors j'ai fais ces modifs la :

    dans le controlleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public ActionResult Create()
            {
                var list = new SelectList(db.Categories.ToList().Select(r => new SelectListItem { Value = r.CategoryId.ToString(), Text = r.CategoryName }), "CategoryId", "CategoryName"); 
     
                ViewBag.categorie = list.Items;
     
                return View();
            }
    Ainsi que la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public ActionResult Create([Bind(Include = "ArticleId, Categorie")] Article article)

    Dans la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    div class="form-group">
                @Html.LabelFor(model => model.Categorie, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("Categorie", (IEnumerable<SelectListItem>)ViewBag.categorie, "Veuillez choisir une catégorie")
                </div>
            </div>
    Et maintenant j'ai cette erreur :

    Échec de la conversion de paramètre du type «*System.String*» en type «*_03082017_XXX.Models.Category*», car aucun convertisseur de type ne peut effectuer une conversion entre ces types.

    Une idée? Car je comprend l'erreur mais je ne vois pas comment et ou régler le problème :/

  4. #4
    Membre confirmé Avatar de Julien698
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2013
    Messages : 237
    Points : 473
    Points
    473
    Par défaut
    Salut,

    Tu peux d'ajouter directement le IEnumerable dans ton modèle ainsi que la catégorie choisie (pour le httppost) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public IEnumerable<SelectListItem> Categories {get; set;}
    public string SelectedCategory {get; set;}
    Dans ton contrôleur, l'actionresult "create" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public ActionResult Create()
            {
                var list = db.Categories.ToList()
                            .Select(r => new SelectListItem { Value = r.CategoryId.ToString(), Text = r.CategoryName }); 
     
     
                Article ar = new Article();
                ar.Categories = list // ou un truc du style 
     
                return View("Create",Article);
            }

    Puis dans la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.DropDownListFor(m => m.SelectedCategory, Model.Categories)
    Tu devras sans doute adapter pour que ça fonctionne, mais dans l'idée en faisant ça lors de ton httppost tu devrais retrouver la catégorie sélectionnée via le modèle.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 92
    Points : 33
    Points
    33
    Par défaut
    Merci cela fonctionne

    Un grand merci à toi

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2014
    Messages : 153
    Points : 227
    Points
    227
    Par défaut
    Une Bonne chose que ça fonctionne.
    Juste une remarque:
    le db. dans ton contrôleur c'est pas trop bon pour l'architecture.
    Tu devrais faire tes couches services et repository pour le bien.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2009
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 92
    Points : 33
    Points
    33
    Par défaut
    Merci pour le conseil

    Par contre histoire de faire le chose bien tu aurait un liens qui explique comment faire les choses proprement?

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

Discussions similaires

  1. Utilisation d'une liste déroulante générée en ASP
    Par arkante1984 dans le forum ASP
    Réponses: 10
    Dernier message: 06/03/2007, 14h14
  2. Réponses: 3
    Dernier message: 25/04/2005, 15h26
  3. asp + liste déroulante
    Par cell dans le forum ASP
    Réponses: 6
    Dernier message: 25/04/2005, 14h12
  4. liste déroulante asp dans javascript
    Par croco83 dans le forum ASP
    Réponses: 6
    Dernier message: 12/05/2004, 17h50
  5. liste déroulante en ASP vbscript
    Par leeloo076 dans le forum ASP
    Réponses: 9
    Dernier message: 17/03/2004, 16h42

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