mercredi 17 février 2010

Respect nomenclature MVC

Bonjour,

Un petit billet rapide pour vous méfier des syntaxes sur MVC. En effet, j'ai été confronté a un problème très bête, mais lorsque l'on n'est pas habitué a MVC on peux chercher longtemps l'erreur.

Voici l'erreur :
System.ArgumentException: The parameters dictionary contains a null entry for parameter 'idCategorie' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Cat(Int32)' in 'SiteArticle.UI.Controllers.ArticleController'. To make a parameter optional its type should be either a reference type or a Nullable type.
Nom du paramètre : parameters

Accès :
http://localhost:53809/Article/Cat/3

Code :
public ActionResult Cat(int idCategorie)
{
    IEnumerable< article > IEArticle = this._service.ListArticles(idCategorie);

    if (IEArticle.Count() > 0)
        return View(IEArticle);
    else
        return View("NotFound");
}

En fait, le problème est simpliste... dans votre route (Global.asax) vous avez défini la règle
suivante (enfin MVC de microsoft ?!) :
routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Article", action = "Index", id = "" }  // Parameter defaults
);

Depuis ce routage, le nom de la variable est obligatoirement "id" si vos méthodes de vos controllers ne respectent pas cette nomenclature vous aurez le message d'erreur.

C'est tout bete, mais on peux chercher parfois pendant des heures pourquoi on a ce type de probleme !

Enjoy

Mise à jour partielle d'entités NHibernate et MVC

Bonjour,

Suite a des petits problèmes de compréhension de NHibernate et MVC sur la modification des objets, je me permet de mettre un petit billet pour expliquer mes problèmes et pour montrer comment je les aient résolus.

Initialement dans mon controller, j'ai une méthode en POST qui souhaite mettre a jour un article :

// fonctionne si tous les champs du formulaire doivent etre mise a jour or dans mon cas, la date de création/modif
// ne doivent pas etre mis a jour !
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article articleToEdit) 
{
    if (this._service.EditArticle(articleToEdit))
        return RedirectToAction("Index");
    return View();
}

Cela fonctionne bien, sauf que pour mon article en édition, je n'ai pas rempli de date de création, de ce fait, l'objet "articleToEdit" a comme "01/01/0001" en valeur d'attribut datecreation.

Pour mettre a jour un article, il faut récupéré l'identifiant de l'article et travailler avec ce dernier pour le mettre a jour.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection)
{
    Article articleToEdit = this._service.GetArticle(id);
    UpdateModel(articleToEdit);

    if (this._service.EditArticle(articleToEdit))
        return RedirectToAction("Index");
    return View();     
}

En fait, on va tout d'abord récuperer l'article a éditer, et à l'aide de la méthode "UpdateModel" (implémentée par le controller), cela nous permet de mettre a jour notre articleToEdit avec les informations de notre formulaire.
En débuggage on le voit tres bien :

Avant :
Apres :

mercredi 3 février 2010

TP Active Record - Articles/Catégorie [Compil] (Partie 4)

Nous voici dans la 4nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
Voici la liste des articles disponibles :
Dans cette partie nous allons verifier le fonctionnement du code que vous avons produit dans les parties précédentes.

TP Active Record - Articles/Catégorie [NHibernate] (Partie 3)

Nous voici dans la 3nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
A ce niveau la nous utiliserons le pattern  " ActiveRecord " de l'API Castle Project utilisant NHibernate. ActiveRecord est un design pattern qui permet de masquer la complexité des interactions avec la base de données en évitant d'écrire du code SQL
Le gros avantage avec ce pattern c'est qu'il permet d'écrire aussi dans une seule et même classe le mapping base de données et la classe/l'objet métier. Je vous invite à lire l'article montrant les différences de fonctionnement entre " ActiveRecord " et un accès classique NHibernate (Mapping_NHibernate_2010-01 ...).

TP Active Record - Articles/Catégorie [Archi] (Partie 2)

Nous voici dans la 2nd section TP Active Record, ceci est l'explication pas à pas d'un TP de création de site Web permettant de créer des articles et d'en associer des catégories.
Nous allons décrire les étapes pour créer une solution depuis Visual Studio 2008 simple et pratique pour la réalisation de notre TP. Je rappel que cette solution n'est pas l'unique solution, mais me convient pour l'instant.

TP Active Record - Articles/Catégorie [Intro] (Partie 1)

Bonjour a tous,

Dans ce 1er TP, nous allons créer un site permettant de gerer des articles associés a des catégories. Un sujet classique, cas d'école, qui nous permettra de voir les différents concepts : NHibernate, MVC 3.5, Castle Active Record, Linq et bien d'autres.
Voici le sommaire que je vous propose :

lundi 1 février 2010

Portage du tutoriel Contact Manager de Entity Framework à NHibernate (et Oracle)

De la même maniere que mon cher collègue Michel, sur son blog (Linq To SQL). Je vais vous présentez comment migrer de Entity Framework à NHibernate + Oracle.

Tout d'abord les informations nécessaires

Création du modèle
Tout de suite, ici il ne s'agit pas de faire du drag'n drop de vos tables avec de beaux object Visual Studio ! Il faut coder lignes par lignes notre modele de persistance.
Tout d'abord supprimez :
  • le fichier "modele" .edmx
  • les références inutiles (System.Data.Entity)
  • le repository : EntityContactManagerRepository.cs