[.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:
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:
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:
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:
Citation:
[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:
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.