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 :

Public virtual Null


Sujet :

ASP.NET MVC

  1. #1
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut Public virtual Null
    Bonjour,

    Lors d'un ajout, d'une modification ou suppression d'un utilisateur, le controller me remonte une erreur sur ma variable Droit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public partial class Utilisateur
        {
            public int PKIdUtilisateur { get; set; }
            public string Nom { get; set; }
            public string Prenom { get; set; }
            public string Trigramme { get; set; }
            public string Identifiant { get; set; }
            public string Mot_de_passe { get; set; }
            public int FK_IdDroit { get; set; }
     
            public virtual Droit Droit { get; set; }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public partial class Droit
        {
            public Droit()
            {
                this.Utilisateur = new HashSet<Utilisateur>();
            }
     
            public int PKIdDroit { get; set; }
            public string Nom { get; set; }
            public int Niveau { get; set; }
            public virtual ICollection<Utilisateur> Utilisateur { get; set; }
        }
    Par exemple lors d'une modification d'un utilisateur je passe un objet utilisateur à la vue. Celui-ci comporte toutes les informations.

    En revanche lorsque je clique sur le bouton modifier de ma vue l'objet que me retourne la vue est rempli sauf mon objet Droit qui est null est le controller (ModelState) me remonte comme erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Échec de la conversion de paramètre du type «*System.String*» en type «*CULTE.Models.Droit*», car aucun convertisseur de type ne peut effectuer une conversion entre ces types
    Auriez vous un idée merci ?

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Aurais-tu le code du contrôleur et de la vue ?

    Cdt
    Christophe B.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    @model CULTE.Models.Utilisateur
     
    @{
        ViewBag.Title = "Information utilisateur";
    }
     
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="row-fluid">
            <div class="span8 offset2">
                <div class="well">
     
                    <fieldset>
                        <legend>@ViewData["Message"]</legend>
                        @Html.HiddenFor(model => model.PKIdUtilisateur)
                        @Html.HiddenFor(model => model.FK_IdDroit)
                        @Html.HiddenFor(model => model.Droit)
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.Nom)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(model => model.Nom)
                                @Html.ValidationMessageFor(model => model.Nom)
                            </div>
                        </div>
     
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.Prenom)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(model => model.Prenom)
                                @Html.ValidationMessageFor(model => model.Prenom)
                            </div>
                        </div>
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.Trigramme)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(model => model.Trigramme)
                                @Html.ValidationMessageFor(model => model.Trigramme)
                            </div>
                        </div>
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.Identifiant)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(model => model.Identifiant)
                                @Html.ValidationMessageFor(model => model.Identifiant)
                            </div>
                        </div>
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.Mot_de_passe)
                            </div>
                            <div class="editor-field">
                                @Html.EditorFor(model => model.Mot_de_passe)
                                @Html.ValidationMessageFor(model => model.Mot_de_passe)
                            </div>
                        </div>
                        <div class="control-group">
                            <div class="editor-label">
                                @Html.LabelFor(model => model.FK_IdDroit)
                            </div>
                            <div class="editor-label">
                                @Html.DropDownList("Droit")
                                @Html.ValidationMessageFor(model => model.FK_IdDroit)
                            </div>
                        </div>
                        @if(ViewData["btn"]=="Modifier")
                        {
                            <input class="btn btn-warning" type="submit" value="Enregistrer" />
                        }
                        else if(ViewData["btn"]=="Supprimer")
                        {
                            <input class="btn btn-warning" type="submit" value="Supprimer" /> 
                        }
                        else
                        { 
                            <input class="btn btn-warning" type="submit" value="Ajouter" />
                        }
                    </fieldset>
                </div>
            </div>
        </div>
    }
    Controller:
    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
    [ActionName("InformationUtilisateur")]
            [HttpPost]
            public ActionResult InformationUtilisateurPost(Utilisateur model, FormCollection collection)
            {
                try
                {
                    var errors = ModelState.Values.SelectMany(v => v.Errors);
                    if (ModelState.IsValid)
                    {
                        if (!repUtilisateur.GetUser(model))
                        {
                            repUtilisateur.CreateUser(model);
                            return RedirectToAction("Index", "Parametre");
                        }
                    }
                    else
     
                        // affichage de la vue error
                        PopulateDropDownListDroit();
                    return View();
                }
                catch (Exception)
                {
                    // affichage de la vue error
                    return View("Error");
                }
            }

  4. #4
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Eh bien ton @Html.HiddenFor(model => model.Droit) génère une chaîne de caractères postée avec le reste des données de formulaire. D'où ton erreur. Retire le HiddenFor.

    Plus généralement, mais cela n'engage que ma propre vision des choses, tu devrais avoir un modèle de données et un modèle de vue. Perso j'utilise entity framework avec un modèle généré à partir de la base et je n'envoie jamais d'entité à mes vues mais des modèles spécialement écrits pour celles-ci. C'est une façon de faire qui demande un chouia plus de développement mais qui me permet de mieux maîtriser les données qui transitent.

    Cdt
    Christophe B.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    Nom : Sans titre.jpg
Affichages : 231
Taille : 97,9 Ko

    Toujours la même erreur merci pour ton retour

  6. #6
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ok, regarde aussi du côté de @Html.DropDownList("Droit"). Ta dropdown list contient des composés de deux élements : une valeur et un texte d'affichage. En mettant "Droit" au nom de ta dropdownlist tu indique implicitement qu'il doit affecter la valeur sélectionnée (qui est un string) à la propriété Droit qui est de type Droit. Le nom de ta dropdown devrait être @Html.DropDownList("FK_IdDroit").

    Tu risques aussi de rencontrer un autre problème. Tu déclares un @Html.HiddenFor(model => model.FK_IdDroit) et un dropdown list destiné à modifier un droit en affectant FK_IdDroit. Il a y avoir un conflit.

    Cdt
    Christophe B.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par elbj Voir le message
    Ok, regarde aussi du côté de @Html.DropDownList("Droit"). Ta dropdown list contient des composés de deux élements : une valeur et un texte d'affichage. En mettant "Droit" au nom de ta dropdownlist tu indique implicitement qu'il doit affecter la valeur sélectionnée (qui est un string) à la propriété Droit qui est de type Droit. Le nom de ta dropdown devrait être @Html.DropDownList("FK_IdDroit").

    Tu risques aussi de rencontrer un autre problème. Tu déclares un @Html.HiddenFor(model => model.FK_IdDroit) et un dropdown list destiné à modifier un droit en affectant FK_IdDroit. Il a y avoir un conflit.

    Cdt
    Merci pour ton retour, effectiviement tu as raison @Html.DropDownList("Droit") rentre en conflit avec mon objet Droit, je viens de changer @Html.DropDownList("Droit") en @Html.DropDownList("ListDroit")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private void PopulateDropDownListDroit(object selected = null)
            {
                ViewBag.ListDroit = new SelectList(repDroit.Get(), "PKIdDroit", "Nom", selected);
            }
    Le modelstat ne génère plus d'erreur par contre je perds l'id de mon droit et je ne comprend pas pourquoi

  8. #8
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    C'est normal, il faut bien que tu indiques à ta dropdown quel droit est sélectionné. De plus son nom devrait être FK_IdDroit.
    Christophe B.

  9. #9
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Petit exemple tiré d'un projet en cours chez moi

    Dans le controller je prépare la liste des options possibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<SelectListItem> liste = new List<SelectListItem>();
                liste.Add(new SelectListItem() { Value = "0", Text = "Tous" });
                liste.Add(new SelectListItem() { Value = "1", Text = "- de 3 ans" });
                liste.Add(new SelectListItem() { Value = "2", Text = "de 3 à 6 ans" });
                liste.Add(new SelectListItem() { Value = "3", Text = "+ de 6 ans" });
                ViewBag.LimitesAges = liste;
    Dans la vue je déclare le dropdownlist :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.DropDownListFor(model => Model.AgeEnfants, ViewBag.LimitesAges as IEnumerable<SelectListItem>)
    Christophe B.

  10. #10
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    Merci c'est parfait

  11. #11
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par elbj Voir le message
    Petit exemple tiré d'un projet en cours chez moi

    Dans le controller je prépare la liste des options possibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<SelectListItem> liste = new List<SelectListItem>();
                liste.Add(new SelectListItem() { Value = "0", Text = "Tous" });
                liste.Add(new SelectListItem() { Value = "1", Text = "- de 3 ans" });
                liste.Add(new SelectListItem() { Value = "2", Text = "de 3 à 6 ans" });
                liste.Add(new SelectListItem() { Value = "3", Text = "+ de 6 ans" });
                ViewBag.LimitesAges = liste;
    Dans la vue je déclare le dropdownlist :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Html.DropDownListFor(model => Model.AgeEnfants, ViewBag.LimitesAges as IEnumerable<SelectListItem>)
    Suite à ton aide je me retrouve encore bloqué car je souhaite définir par défaut par le controleur et non la vue !!

    Comme puis-je faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     @Html.DropDownListFor(m => m.list, ViewBag.ListUP as IEnumerable<SelectListItem> )
               @Html.ValidationMessageFor(m => m.list)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void PopulateDropDownListUP(object selected = null)
            {
                ViewBag.ListUP = new SelectList(repTravaux.GetListUP(), "upr");
            }

  12. #12
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Je ne comprends pas très bien ce que tu veux faire.
    Si tu veux qu'une valeur par défaut soit sélectionnée dans le ddList alors donne cette valeur à ton objet model qui sert de liaison de binding.
    Christophe B.

  13. #13
    Membre régulier
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par elbj Voir le message
    Je ne comprends pas très bien ce que tu veux faire.
    Si tu veux qu'une valeur par défaut soit sélectionnée dans le ddList alors donne cette valeur à ton objet model qui sert de liaison de binding.
    Merci

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

Discussions similaires

  1. variable public nulle
    Par b.speedy dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2012, 19h10
  2. Variable public nulle
    Par b.speedy dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 30/04/2012, 10h33
  3. [Excel] Publication d'une feuille au format .htm
    Par talumn dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/02/2009, 03h57
  4. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 01h07
  5. Abstract VS virtual
    Par LE CHAKAL dans le forum Langage
    Réponses: 2
    Dernier message: 29/08/2002, 18h50

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