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 :

[.Net MVC]ViewModel Pattern et gestion des erreurs


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 93
    Points : 66
    Points
    66
    Par défaut [.Net MVC]ViewModel Pattern et gestion des erreurs
    Bonjour tout le monde.
    J'essaye d'appliquer le pattern viewmodel sur une de mes actions pour pouvoir afficher le secteur d'une activité sous forme de dropdownlist,tout marche bien mon problème vient quand l'utilisateur ne saisie pas le libelle chose que je gère normalement en utilisant ModelState.AddModelError.
    Voici mes sources,Le controlleur
    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
     
            public ActionResult Edit(int id)
            {
                Activite activite = act.GetActivite(id);
                return View(new ActiviteViewModel(activite));
            }
     
            //
            // POST: /Activites/Edit/5
     
            [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult Edit(int id, FormCollection collection)
            {
                Activite editActivite = act.GetActivite(id);
                try
                {
                    editActivite.libelle = Request.Form["libelle"];
                    string secteur = Request.Form["Secteur_code"];
                    SecteurDAO sec = new SecteurDAO();
                    Secteur sect = sec.getIDSecteur(secteur);
                    editActivite.Secteur_code = sect.code;
                    act.Save();
     
     
     
                    return RedirectToAction("Details", new { id = editActivite.code });
                }
                catch
                {
                    foreach (var issue in editActivite.GetRuleViolations())
                    {
                        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
                    }
     
                    return View(new ActiviteViewModel(editActivite));
                }
     
            }
    le ViewModel:
    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
     
    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using PFAEnvironnement.DAO;
    using System.Web.Mvc;
    using System.Collections;
     
    namespace PFAEnvironnement.Models
    {
        public class ActiviteViewModel
        {
            // Properties
            private Activite activite;
            private SelectList secteurs;
     
            public Activite Activite
            {
                get
                {
                    return this.activite;
                }
     
     
            }
     
            public SelectList Secteurs
            {
                get
                {
                    return this.secteurs;
                }
            }
            // Constructor
            public ActiviteViewModel(Activite act)
            {
                activite = act;
                ISecteurDAO secteur =new  SecteurDAO();
                secteurs = new SelectList(secteur.lstSecteurs(), act.Secteur.libelle);
            }
     
            public ActiviteViewModel()
            {
                ISecteurDAO secteur = new SecteurDAO();
                secteurs = new SelectList(secteur.lstSecteurs());
            }
        }
    }
    et enfin ma page aspx:
    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
     
    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PFAEnvironnement.Models.ActiviteViewModel>" %>
     
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    	Edit
    </asp:Content>
     
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
     
        <h2>Edit</h2>
     
        <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
     
        <% using (Html.BeginForm()) {%>
     
            <fieldset>
                <legend>Fields</legend>
                <p>
                    <label for="Secteur_code">Secteur_code:</label>
                    <%= Html.DropDownList("Secteur_code", Model.Secteurs) %>
                    <%= Html.ValidationMessage("Secteur_code", "*") %>
                </p>
                <p>
                    <label for="libelle">libelle:</label>
                    <%= Html.TextBox("libelle", Model.Activite.libelle) %>
                    <%= Html.ValidationMessage("libelle", "*") %>
                </p>
                <p>
                    <input type="submit" value="Save" />
                </p>
            </fieldset>
     
        <% } %>
     
        <div>
            <%=Html.ActionLink("Back to List", "Index") %>
        </div>
     
    </asp:Content>
    Le problème est que je catch l'exception dans le bloc catch et dans la variable issue j'ai mon problème et le message adéquat pour l'erreur que j'ai définit dans ma classe qui gère les erreurs le problème c'est quand je renvoie vers la vue et exactement quand il veut afficher le libelle il me sort l'erreur:
    [NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.]
    au niveau de le ligne 24 qui est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Ligne 22 :             <p>
    Ligne 23 :                 <label for="libelle">libelle:</label>
    Ligne 24 :                 <%= Html.TextBox("libelle", Model.Activite.libelle) %>
    Ligne 25 :                 <%= Html.ValidationMessage("libelle", "*") %>
    Ligne 26 :             </p>
    Merci d'avance pour vos reponses.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut,

    A priori, ton Model.Activité n'est pas initialisé,il est donc à null. Vérifie que tu n'aies rien oublié. Perso je n'utilise pas le pattern ViewModel donc je ne pourrais pas t'aider mais il semblerai que ce que te retourne la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Activite editActivite = act.GetActivite(id);
    te renvoie un objet à null.
    Essayes de voir en mettant un point d'arret juste apres cette ligne pour tester l'objet.

    Edit : ou alors ton constructeur du viewmodel ne sette pas la propriété Activité comme il faut...

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 93
    Points : 66
    Points
    66
    Par défaut
    L'erreur ne venait pas de là. Mais plutôt ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                catch
                {
                    foreach (var issue in editActivite.GetRuleViolations())
                    {
                        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
                        ModelState.SetModelValue(issue.PropertyName, new ValueProviderResult("", editActivite.libelle, null));
                    }
                    return View(new ActiviteViewModel(editActivite));
                }
    il fallait que j'ajoute le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);

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

Discussions similaires

  1. architecture MVC et gestion des erreurs
    Par mapmip dans le forum Modélisation
    Réponses: 1
    Dernier message: 10/04/2013, 13h33
  2. Réponses: 0
    Dernier message: 23/08/2011, 15h12
  3. [PHP 5.3] Gestion des erreurs et exceptions et MVC
    Par RunCodePhp dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2011, 11h42
  4. [ASP .NET][VB] Gestion des erreurs non gérées
    Par aloisio11 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 04/10/2007, 10h13
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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