Affichage des articles dont le libellé est MVC. Afficher tous les articles
Affichage des articles dont le libellé est MVC. Afficher tous les articles

vendredi 22 novembre 2013

Compilation des vues MVC (view)

Bonjour,
Si comme moi vous utiliser MVC pour vos applications WEB avec C#, vous devriez connaitre ce mot clé : MvcBuildViews.
Pour les autres, c’est tout simplement le moyen de vérifier par compilation que l’ensemble de vos vues de votre Projet MVC ne comporte aucune erreur de compilation. Attention, cette opération est assez longue a s’exécuter.
Pour faire cette modification, il suffit de modifier votre fichier project (.csproj), sous l’élément propertygroup, rajouter la clé xml suivante :
Lancer la compilation classique de MVC dans Visual studio, et la miracle, dans la fenêtre de sortie vous devriez voir apparaitre la ligne suivante :

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v temp -p C:\MonSiteMVC\bin\maDll.dll

Maintenant, le constant :
  • changer a chaque fois le projet pour vérifier la compilation des vues c’est super chiant (passer true/false), et risque d’oubli
  • laisser a true, c’est super chiant, car la compilation prend a chaque fois 3 Min !!
  • laisser a false, c’est pas propre car on ne voit donc pas les erreurs sur les vues (surtout si il en existe beaucoup)
Du coup, une solution toute simple existe, c’est le lié l’élément XML a une configuration. Dans notre cas, ce que je conseil est d’associer :
  • Config DEBUG : MvcBuildViews : False
  • Config RELEASE : MvcBuildViews : False

Pour cela, il faut éditer le fichier projet (csproj) en rajoutant 2 sections :
Ps : si vous avez un serveur d’intégration du style TFS (Visual Studio Online de son nouveau nom) ou TeamCity, il suffit de lancer votre build en mode Release pour obtenir la compilation des vues automatiques.

Voila, j’espère être assez clair.
Coding4Fun

lundi 7 octobre 2013

Injection de dépendance sur les controllers WebApi MVC (ApiController)

Bonjour à tous,
Dans un précédent article, je vous parlais de la mise en place de WEB Api avec les instructions MVC 4. Dans l’article, je ne parlais pas d’injection de dépendance, très souvent utilisée avec NHibernate par exemple (ce qui est mon cas).
Pour cela quelques étapes sont nécessaire pour faire le paramétrage de cette injection. MVC a déjà tout prévu pour nous :)
  • Modification du Global.asax
  • Utilisation de IHttpControllerActivator
  • Utilisation de Windsor Castle
Avant de rentrer dans le vif du sujet, attardons nous un petit moment sur l’injection de dépendance. Comment résumer cette notion sur un blog ? Hum pas évident. pour ma part je l’expliquerai avec une boite (container – conteneur en français ^^) qui connait les définitions des (de nos) objets.
De ce faite, c’est ce container qui construira/fabriquera/instanciera a la demande les objets nécessaire a l’exécution du code. L’intérêt de cette méthode est de rendre autonome au maximum nos classes (dépendance). Généralement cette dépendance, se voit au constructeur; ce dernier disposera alors comme paramètre l’ensemble des dépendances a résoudre lors de l’instanciation.
Ce n’est pas une notion facile a appréhender / comprendre. Moi même j’ai eu beaucoup de mal au début. Cependant, l’intérêt est tout de suite parlant dès lors ou vous avez a faire a des projet utilisant, ou nécessitant l’utilisation de ce mécanisme.

Global.asax

Le point d’entré de l’application permet d’exécuter le paramétrage de notre/nos injection(s). Dans notre cas, nous alors donc remplacer la “routine” du Controller sur nos  Web API, par notre propre “Activator” qui se positionnera donc entre la demande de la requête et son traitement. Permettant ainsi de résoudre, et de fournir le contrôleur adéquate (comprendre: Castle.Windors instanciera alors notre Controller avec les dépendances et le retournera a MVC).
Il est important de noter qu’il faut distinguer les routes de type WebAPI et les autres (mvc classique). L’injection ne sera pas la même, on passera alors par la fabrique de controller (ControllerBuilder.Current.SetControllerFactory(controllerFactory) )

protected void Application_Start()   
{

[…]

GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Dispatcher.IHttpControllerActivator), new WindsorCompositionRoot(container.Kernel));

}

IHttpControllerActivator

Une fois l’appel fait dans notre Application_Start, nous fournissons alors a notre Activator le Kernel (notre container de référence), pour que ce dernier puisse piocher dedans afin de faire l’instanciation.
L’interface est assez simple; 2 méthodes
- Create : création du controller en question, on va résoude (resolve) dans notre container la référence, et retourner ce dernier.
- Le Dispose, il faut lors de la fin d’execution de la requete HTTP (webapi) que les ressources acquises soient libérées. On implemente alors un classe Disposable, utilisable a l’aide de RegisterForDispose.
public class WindsorCompositionRoot : IHttpControllerActivator   
{    
    private readonly IKernel kernel;

    public WindsorCompositionRoot(IKernel kernel)   
    {    
        this.kernel = kernel;    
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)   
    {    
        var controller = (IHttpController)this.kernel.Resolve(controllerType);

        request.RegisterForDispose(new RessCtrlRelease(this.kernel, controller));

        return controller;   
    }

    private class RessCtrlRelease : IDisposable   
    {    
        private readonly IKernel kernel;    
        private IHttpController httpController;

        public RessCtrlRelease(IKernel kernel, IHttpController httpController)   
        {    
            this.kernel = kernel;    
            this.httpController = httpController;    
        }    
        public void Dispose()    
        {    
            this.kernel.ReleaseComponent(this.httpController);    
        }    
    }

}

Je ne sais pas si j’ai été suffisamment clair, c’est un sujet assez vague et complexe, mais j’espère que les bouts d’informations que j’ai mise en place permettront d’éclaircir et d’aider les développeurs que nous sommes.
Parce que beaucoup d’information existe sur la toile, un article m’a beaucoup aider : http://blog.ploeh.dk/2012/04/17/InjectingHttpControllerContextWiththeASP.NETWebAPI/
Articles en relation :

lundi 5 août 2013

Mise en place de Web API - MVC4


Bonjour à tous, aujourd’hui dans ce billet nous allons voir et appréhender une nouveauté de MVC 4 qui est les WEB API. Pour faire simple, est le WEB API de MVC4 permet principalement de faire du REST (REpresentational State Transfer) afin de piloter les données envoyées depuis différentes sources :
  1. le serveur reçoit un requête HTTP (http://mon-site.com/api/GetProducts)
  2. le serveur traite la demande (base de données, calcul etc…
  3. le serveur renvoi la requête sous forme XML/JSON au client.

vendredi 9 juillet 2010

Gestion des paramètres culturel MVC Asp.net

Bonjour,

Petite news bien pratique, la gestion de la culture sur un site MVC en Asp.Net.

Dans mon cas, je travail en local (dev) sur mon Poste Windows, en français. Or lorsque je déploie il n'est pas toujours évident de retrouver les paramètre culturel identique a son poste de travail.

Pour cela, il suffit de rajouter ses quelques lignes dans le fichier Global.asax.cs

/// 
/// Begin Request début de requete HTTP sur l'application
/// 
/// /// protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpCookie cookie = Request.Cookies["CultureInfo"];

    if (cookie != null && cookie.Value != null)
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(cookie.Value);
      Thread.CurrentThread.CurrentCulture = new CultureInfo(cookie.Value);
    }
    else
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
      Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
    }
}        

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 :

mercredi 24 juin 2009

Tuto MVC .Net (nerddinner)


Le MVC (modele vue controller) par l'exemple, le plus connu, NERDDINNER :
 - http://nerddinnerbook.s3.amazonaws.com/Intro.htm

Apprendre le MVC sur le site www.asp.net (ainsi que les outils de développement) :