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

ASP.NET MVC & JQuery UI - Accordion

Je souhaite réaliser un "accordéon" en JQuery UI avec un template d'application ASP.NET MVC. Tout ce que je vois sur internet ne fonctionne pas. En tous cas pas avec le template de Visual Studio. Les applications ASP.NET MVC utilisées dans ces exemples, sont trop simples. Elles n'utilisent pas le template de Visual Studio.

Pourquoi JQuery UI ne fonctionne pas avec ASP.NET MVC ?

Ne pas oublier d'installer le NuGet JQuery UI :


L'instruction :
@Scripts.Render( "~/bundles/jquery" )

en bas de la page :
\\WebMvcApplication1\Views\Shared\_Layout.cshtml

Remponne avec l'instruction de la \\Views\Home\Page1.cshtml

@{
    ViewBag.Title = "Page1";
}

<script src="~/Scripts/jquery-1.6.4.js"></script>
<script src="~/Scripts/jquery-ui-1.11.4.js"></script>
<link href="~/Content/themes/base/all.css" rel="stylesheet" />
<link href="~/Content/themes/base/accordion.css" rel="stylesheet" />

<script type="text/javascript">
    $(function () {
        $("#accordion").accordion();
    });
</script>

<h2>Page1</h2>

<div id="accordion">
    <h3>This is the Title1</h3>
    <div>
        <p>
            Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
            ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
            amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
            odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
        </p>
    </div>
    <h3>This is the Title2</h3>
    <div>
        <p>
            Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
            purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
            velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
            suscipit faucibus urna.
        </p>
    </div>
</div>

Solution pour utiliser JQuery UI dans les page ASP.NET MVC

Déplacer l'instruction :
@Scripts.Render( "~/bundles/jquery" )

de la page : \\WebMvcApplication1\Views\Shared\_Layout.cshtml
dans les balises <head> au début de la page. Comme ceci :

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Mon application ASP.NET</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
    @Scripts.Render( "~/bundles/jquery" )
</head>

Supprimer l'instruction :
<script src="~/Scripts/jquery-1.6.4.js"></script>
de la page \\Views\Home\Page1.cshtml

Et ça y est, ça fonctionne :

J'ai ajouté une page dans laquelle j'utilise l'accordion JQuery UI

L'accordion JQuery UI s'affiche dans ma page ASP.NET MVC
Incroyable non ? N'est ce pas de la magie !

Have Fun !
 

ASP.NET MVC Scaffolding

C'est la suite de l'article : ASP.NET MVC 4 CRUD With Entiry Framework 5.0 sur l'utilisation du NuGet Packadge ASP.NET MVC Scaffolding. Je viens de tout recommencer avec Visual Studio 2013. Je sais, je suis un dangereux récidiviste ;)

Regardons si ça fonctionne encore ?

Afficher la fenêtre console de gestion des packages NuGet

C'est ici :
Affichez la console de gestion des packages NugGet

Lancer la commande d'installation de ASP.NET Scaffolding

Voici le résultat de résulat d'exécution de la commande :
PM> install-package mvcscaffolding

Chaque package vous est concédé sous licence par son propriétaire. Microsoft n’est pas responsable et n’accorde pas de licence pour les packages de sociétés tierces. Certains packages peuvent inclure des dépendances qui sont soumises à des contrats de licence supplémentaires. Suivez l’URL de la source du package (flux) pour identifier les dépendances.

Version de l’hôte de la Console du Gestionnaire de package 2.8.50926.663

Tapez « get-help NuGet » pour afficher toutes les commandes NuGet disponibles.

PM> install-package mvcscaffolding
Tentative de résolution de la dépendance « T4Scaffolding ».
Tentative de résolution de la dépendance « T4Scaffolding.Core ».
Tentative de résolution de la dépendance « EntityFramework ».
Installation de « T4Scaffolding.Core 1.0.0 ».
Installation de « T4Scaffolding.Core 1.0.0 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.Core.1.0.0\tools\init.ps1 : 50 Caractère : 30
+         Set-DefaultScaffolder <<<<  -Name CustomTemplate -Scaffolder T4Scaffolding.CustomTemplate -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.Core.1.0.0\tools\init.ps1 : 51 Caractère : 30
+         Set-DefaultScaffolder <<<<  -Name CustomScaffolder -Scaffolder T4Scaffolding.CustomScaffolder -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Installation de « T4Scaffolding 1.0.8 ».
Installation de « T4Scaffolding 1.0.8 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.1.0.8\tools\init.ps1 : 6 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name DbContext -Scaffolder T4Scaffolding.EFDbContext -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.1.0.8\tools\init.ps1 : 7 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Repository -Scaffolder T4Scaffolding.EFRepository -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Installation de « MvcScaffolding 1.0.9 ».
Installation de « MvcScaffolding 1.0.9 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 47 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Controller -Scaffolder MvcScaffolding.Controller -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 48 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Views -Scaffolder MvcScaffolding.Views -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 49 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Action -Scaffolder MvcScaffolding.Action -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 50 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name UnitTest -Scaffolder MvcScaffolding.ActionUnitTest -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 54 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name View -Scaffolder $viewScaffolder -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Ajout de « T4Scaffolding.Core 1.0.0 » à WebApplicationKit.
Ajout réussi de « T4Scaffolding.Core 1.0.0 » à WebApplicationKit.
Ajout de « T4Scaffolding 1.0.8 » à WebApplicationKit.
Ajout réussi de « T4Scaffolding 1.0.8 » à WebApplicationKit.
Ajout de « MvcScaffolding 1.0.9 » à WebApplicationKit.
Ajout réussi de « MvcScaffolding 1.0.9 » à WebApplicationKit.

ASP.NET Scaffolding Installation Conclusion

C'est difficile à dire ?! On dirait que certaines choses se passent @=+}}# Grrrrrrrr
Mais d'autres plantent ... Tentons d'utiliser le package.

Utiliser le module ASP.NET Scaffolding

J'ai le modèle données suivant :
Modèle de donner à Scaffolder
Je lance donc la commande suivante :

PM>Scaffold Controller FOPBooksController –force –DBContextType “ModelContainer”

Et j'espère voir les éléments se créer mais non, ça ne fonctionne plus ....

PM> scaffold controller FOPBooksController –force –DBContextType “ModelContainer”
Invoke-Scaffolder : Impossible de trouver un paramètre positionnel acceptant l'argument « FOPBooksController ».
Au niveau de ligne : 1 Caractère : 9
+ scaffold <<<<  controller FOPBooksController –force –DBContextType “ModelContainer”
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Scaffolder], ParameterBindingException

    + FullyQualifiedErrorId : PositionalParameterNotFound,T4Scaffolding.Cmdlets.InvokeScaffolderCmdlet

MvcScaffolding 1.0.9 ne fonctionne plus

Cela ne fonctionne plus ! J'en était sûr, le module est encore là sur le site de nuget.org

https://www.nuget.org/packages/MvcScaffolding/

Mais plus rien ne fonctionne, pensez l'auteur n'a rien publié depuis Monday, October 08 2012.

Oups ! En y regardant de plus prêt si il y a MvcScaffolding 1.0.8-vs2013
...

MvcScaffolding -Version 1.0.8-vs2013 -Pre

Ben je vais essayer la commande :

PM>Install-Package MvcScaffolding -Version 1.0.8-vs2013 -Pre

Alors, mauvaise organisation du site ... perte de temps ? Certainement !?

Mais ça ne fonctionne pas mieux ! J'en était sûr des packages ne sont plus maintenus et c'est la cata. Je ne vous raconte pas comment VS s'est craché lors des multiples install uninstall de ce package. Franchement c'est pas pro, dommage.

Ne fonctionne pas non plus !

En cherchant un peu :

http://stackoverflow.com/questions/19081028/scaffolding-controllers-with-repositories-in-mvc5-ef6-visualstudio-2013

http://stackoverflow.com/questions/18727299/is-mvcscaffolding-compatible-with-vs-2013-rc-by-command-line

Plus de doute, cela ne fonctionnera plus ... snif !

Et en cherchant encore un peu plus 

J'ai exécuté la commande :
PM> Install-Package Microsoft.AspNet.Mvc.ScaffolderTemplates.AttributeRouting.CSharp

Conclusion

Le package Scaffolding est maintenant "build-in" dans le framework MVC, c'est à dire absorbé par Microsoft dans le framework.

C'est ce que l'on peut comprendre en lisant l'article suivant :

https://code.msdn.microsoft.com/MVC5-Demo-with-Entity-c6bc81df
ASP.NET MVC 5 – CRUD operations with Entity Framework 6 on Visual Studio 2013

La nouvelle commande magique se trouve maintenant (en français) dans :
Dans l'Explorateur de solutions->bouton droit sur le projet ou le dossier "Models" par exemple puis ->Ajouter->Nouvel élément structuré ...

ASP.NET MVC 4 CRUD With Entiry Framework 5.0

Comment faire un CRUD (Create Read Update Delete) avec ASP.NET MVC 4 et Entity Framework EF 5.x sous Visual Studio 2010 ?

Depuis l'avènement des NuGet packages et des autre tools qui entourent Visual Studio, sans lesquels il n'est pas possible de faire quoi que se soit, je trouve que le développement ASP.NET tient de la magie. Comme je n'ai pas froid au yeux et que je suis un peu magicien moi même, à mes heures perdues, je me lance.

J'ai trouvé ceci : ASP.NET MVC 4 – CRUD operations Entity Framework (8 steps to create your site).

Mais moi, je voudrais utiliser :

Visual Studio 2010, avec ASP.NET MVC 4, ADO Entity Framework 5.x et NuGet pour faire un CRUD (create/read/update/delete) de données structurées dans une BD SqlServer.

Est-ce que c'est possible ?

Installation de la plateforme de développement

Tout passe par la gestion des extensions et la configuration des Packages NuGet :

Gestion des Extensions
Il me faut installer deux choses :

Extensions installées par NuGet
NuGet Package Management et EF 5.x DBContext Generator for C# sont les deux extensions nécessaires à la réalisation de mon CRUD.

EF 5.x DBContext Generator for C# va me permettre de créer le modèle de données que j'utiliserai dans mon application ASP.NET MVC4.

Création de ma nouvelle Application MVC4

Après avoir installé le package MVC4 pour Visual Studio que j'ai téléchargé Ici.
Il ne me reste plus qu'à créer mon premier projet : 

Création d'une application ASP.NET MVC 4 avec Visual Studio
La structure du projet est la suivante :
Structure d'un projet ASP.NET MVC4
C'est déjà un projet assez conséquent avec déjà quelques formulaires concernant la création et la gestion des contacts et des utilisateurs de l'application ainsi que leur authentification.

Création du modèle Entity et de la base de donnée SqlServer

Il manque cruellement une base de données que je vais créer avec Entity Framework :
Création du modèle Entity Framework
Dans l'éditeur de modèle, je créé trois Entity (trois tables ou trois objets c'est la même chose) de la façon suivante :
Mon Model1.edmx
Je créé ma base de données SqlServer :

Création de la base SqlServer DataBase1.mdf
Puis je génère le script de création de la base dans l'éditeur de modèle Entity :

Génération du script de création de la base à partir du modèle
Jusque là tout va bien.

Installation de MvcScaffolding package Nuget

Je dois utiliser mvcscaffolding pour créer les objets (contrôlers) que je pourrai utiliser dans mon application ASP.NET MVC c'est là que je trouve que les choses sont un peu magiques !

Il faut taper la commande :

PM> install-package mvcscaffolding
dans la console de management des packets qui se trouvent ici :

Afficher la console PM (Package Management)

Exécution de la commande :

PM> install-package mvcscaffolding
Tentative de résolution de la dépendance « T4Scaffolding ».
Tentative de résolution de la dépendance « T4Scaffolding.Core ».
Tentative de résolution de la dépendance « EntityFramework ».
Installation de « T4Scaffolding.Core 1.0.0 » terminée.
Vous téléchargez EntityFramework à partir de Microsoft. Le contrat de licence est disponible à l’emplacement http://go.microsoft.com/fwlink/?LinkID=320539. Vérifiez si le package contient des dépendances susceptibles de faire l’objet de contrats de licence supplémentaires. Votre utilisation du package et des dépendances confirment votre acceptation de leurs contrats de licence. Si vous n’acceptez pas les contrats de licence, supprimez les composants correspondants de votre ordinateur.
Installation de « EntityFramework 6.1.0 » terminée.
Installation de « T4Scaffolding 1.0.8 » terminée.
Installation de « MvcScaffolding 1.0.9 » terminée.
Ajout réussi de « T4Scaffolding.Core 1.0.0 » à MvcApplication2.
« EntityFramework 5.0.0 » a été supprimé avec succès de MvcApplication2.
Ajout réussi de « EntityFramework 6.1.0 » à MvcApplication2.

Type 'get-help EntityFramework' to see all available Entity Framework commands.
Ajout réussi de « T4Scaffolding 1.0.8 » à MvcApplication2.
Ajout réussi de « MvcScaffolding 1.0.9 » à MvcApplication2.
Désinstallation de « EntityFramework 5.0.0 » terminée.

Utilisation du package MvcScaffolding

Mon package étant installé, je peux maintenant l'utiliser :
J'ai créé trois Entity : Compagny, Region, Departement, je vais donc lancer trois commande :

PM> scaffold controller CompagnyController –force –DBContextType “ModelContainer”
Scaffolding CompagnyController...
Added database context 'Models\ModelContainer.cs'
Added 'Compagny' to database context 'MvcApplication2.Models.ModelContainer'
Get-PrimaryKey : Error HRESULT E_FAIL has been returned from a call to a COM component.
At E:\Templates\MvcApplication2\packages\MvcScaffolding.1.0.9\tools\Controller\MvcScaffolding.Controller.ps1:71 char:29
+ $primaryKey = Get-PrimaryKey <<<<  $foundModelType.FullName -Project $Project -ErrorIfNotFound
    + CategoryInfo          : NotSpecified: (:) [Get-PrimaryKey], COMException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.GetPrimaryKeyCmdlet

Error du package MvcScaffolding

Et là c'est la drame :

Error du package MvcScaffolding

Solution du package MvcScaffolding

Comment faire pour se sortir de ce très mauvais pas ! Voici ce que j'ai fais, c'est issu une longue longue expérience des outils et des problèmes Microsoft.

Créer le modèle EDMX au bon endroit

Je recréé le modèle .edmx dans le répertoire modèle afin que les objets générés aient le "bon namespace" car je pense que MvcScaffolding est typiquement le genre d'outil à se planter sinon ... 

Le Modèle Entity dans le répertoire Models ...
Je supprime l'ancien modèle et je créé le nouveau à partir de la BD ça fonctionne.

Modifier la génération pour obtenir des DbContext

En suite, on voit que Scaffold souhaite des objets de type DbContext c'est plus moderne. Je vais donc bouton-droit dans l'éditeur de modèle Entity pour faire :

Modèle Entity ajout d'une génération spécifique
Et je choisi :

Choix du EF DbContext Generator
Dans le fichier :
\\Templates\MvcApplication2\MvcApplication2\Models\Model1.Context.cs

public partial class DataBase1Entities : DbContext

DataDataBase1Entities ne dérive plus de ObjectContext mais de DbContext

Relancer la commande Scaffold

Comme j'ai créé la base à partir du modèle Entity mon objet Compagny s'appelle CompagnySet je lance donc la commande :
PM> scaffold controller CompagnySetController –force –DBContextType “ModelContainer”
Scaffolding CompagnySetController...
Added database context 'Models\ModelContainer.cs'
Added 'CompagnySet' to database context 'MvcApplication2.Models.ModelContainer'
Added controller Controllers\CompagnySetController.cs
Added Create view at 'Views\CompagnySet\Create.cshtml'
Added Edit view at 'Views\CompagnySet\Edit.cshtml'
Added Delete view at 'Views\CompagnySet\Delete.cshtml'
Added Details view at 'Views\CompagnySet\Details.cshtml'
Added Index view at 'Views\CompagnySet\Index.cshtml'
Added _CreateOrEdit view at 'Views\CompagnySet\_CreateOrEdit.cshtml'

Cette fois ça fonctionne et mes objets ont été correctement créés :

CRUD complet sur l'objet Compagny Créé par Entity et Scaffold
A l'exécution, j'obtiens bien la possibilité de créer affin en liste mes Compagny :

Créer une nouvelle Compagny
Formulaire de création
Liste des Compagny
Et ne trouvez-vous pas cela magique ?

C'est quoi une Application ASP.NET MVC ?

Vous souhaitez effectuer vos premiers pas en créant votre première application ASP.NET MVC avec Visual Studio ? C'est le bon article. Une fois les outils MVC installés, utiliser l'admin tool pour configurer un utilisateur Admin et la base de données ASPNETDB.MDF est crée automatiquement, on peut alors commencer l'exploration de modèle et de l'application crée par ce modèle.

Un Template d'Application MVC 4 possède la structure suivante :

ASP.NET MVC 4 : Template
Deux projets, l'Application Web et un projet de Test :

ASP.NET MVC 4 : Template Test
L'Application Web ASP.NET MVC est constituée de Models, Views et de Controllers.

View

Navigation depuis la vue : 

@Html.ActionLink("Home", "Index", "Home")

System.Web.Mvc.Html.LinkExtensions
        // Summary:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //   linkText:
        //     The inner text of the anchor element.
        //   actionName:
        //     The name of the action.
        //   controllerName:
        //     The name of the controller.
        // Returns:
        //     An anchor element (a element).
        //
        // Exceptions:
        //   System.ArgumentException:
        //     The linkText parameter is null or empty.
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName);

Controllers

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
            return View();
        }

public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
{
   ...

namespace System.Web.Mvc
{
    public abstract class ActionResult

ViewBag : Objet du controleur de base : dynamic data dictionnary
namespace System.Web.Mvc
{
     public abstract class ControllerBase : IController
    {
         public dynamic ViewBag { get; }

To Be Continued

Migration d'application MVC 3 en MVC 4

Avec Visual Studio 2010 SP1 Rel, j'ai installé MVC 3 puis MVC 4 mais Visual Studio ne me propose pas de créer des application MVC 3. Qu'à cela ne tienne, je me propose d'étudier la migration d'application MVC 3 vers MVC 4.

Je viens de télécharger une application du CodePlex :
http://advsampleapp.codeplex.com/
Sample app for Adventureworks database

Et il se trouve qu'à la page suivante :
http://www.mztools.com/Articles/2008/MZ2008017.aspx
On me dit que c'est une application MVC 3.

Lorsque je charge cette solution dans mon Visual Studio, j'obtiens l'erreur suivante :

AdventureWorks.Web.csproj is not supported by this installation
C'est assez curieux car je pensais que VS me proposerait de traduire cette application de MVC 3 vers MVC 4 mais il n'en est rien. Puis-je le faire à la main ?

Je regarde la ligne d'une application MVC 4 standard :
<ProjectTypeGuids>{E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

Et je copie cette ligne directement dans le fichier :
\\advsampleapp-15464\Adventureworks\Adventureworks.Web\Adventureworks.Web.csproj

Que se passe t-il ?

Adventureworks.Web.csproj - Reload Project
J'obtiens un résultat encourageant :

Adventureworks.Web.csproj - Install de ASP.NET Web pages with Razor syntax 1.0
Le Web Platform Installer me propose d'installer Razor 1.0 ... Ce que je ne fais pas. Je reload simplement mon projet mais au moment de builder l'application, j'obtiens une "Erreur non spécifiée". Par expérience je me doute qu'il s'agit des "Services Références". Au moment de faire un Update des Services Référence :



J'obtiens l'erreur suivante :

Service Reference is invalid
Mais une fois mon service reference "PurchasingService" reconstruit l'application ne compile toujours pas. Je décide d'installer ce qui était préconiser le :

Web Platform Installer : Visual Studio 2010 SP1 Tool pour ASP.NET WebPages 1.0
En cliquant sur "Installer" :

Version de NuGet installés incompatible avec ASP.NET MVC 3 Tools Update
Consultez le lien :

En consultant ce lien, on tombe sur un Getting Started with MVC. On y verra également un getting started with MVC 5. Ce n'est pas très cool !

Conclusion MVC 3 vers MVC 4

La migration d'application MVC 3 en MVC 4 ce n'est pas gagné !

Pour aller plus loin :
Donc la version de Razor utilisée pour MVC 3 est 1.0 tandis que MVC 4 utilise Razor 2.0

Références du projet AdventureWorks Sample
DLLs qui utilisent ASP.NET Web Pages\v2.0 :
System.Web.Helpers.dll
System.Web.WebPages.dll

Et si on les fait pointer ces références vers la version v1.0 que se passe t-il ?

L'application Build mais à l'exécution en mode DEBUG :

Windows authentication is not enabled
Mais cela c'est du classique, il s'agit de la gestion des droits d'accès au répertoire virtuel, aux BD ASPNETDB et AdventureWorks, de chaines de connexion dans le Web.config ...

Outil de traduction automatique MVC3 vers MVC4

Et sinon vous avez un outils NuGet qui traduit automatiquement une solution MVC3 en MVC4 :

Auto Upgrade MVC 3 To MVC 4 1.0.1

Mais il était important de découvrir ce que cet outil doit faire pour traduire une solution.



ASP.NET MVC 3 - MVC 4

Dans un post précédent ASP.NET MVC, j'avais regarder de loin l'installation du framework asp.net mvc, le développement d'application avec razor ou webform. Je vais faire un refocusing sur le développement ASP.NET MVC et je m'arrêterai à MVC 3 ou MVC 4 ou les deux, pour simplifier ;)

ASP.NET MVC 3 Installation

Une fois Visual Studio installé et une version de SQL Server, l'installation du framework MVC 3 commence ici : ASP.NET MVC 3
ASP.NET MVC 3 Tools Update - Installation en Anglais
Curieusement si vous choisissez la langue Française le titre change pour l'appellation : ASP.NET MVC 3 RTM Tools Update, et je n'ai pas trop d'explications quant aux "RTM" ...

Encore une chose peu orthodoxe, si vous cliquez sur le bouton Download vous obtenez un choix :

ASP.NET MV 3 Tools Update Choices
 Ce qui donne en français :

ASP.NET MVC 3 Tools Update Choices in French
C'est un peu déroutant, on télécharge donc les trois fichier puis on va cliquer sur AspNetMVC3ToolsUpdateSetup.exe en premier, puis sur AspNetMVC3ToolsUpdateVS11Setup.exe.

Microsoft ASP.NET MVC 3 - 1
Poursuite de l'installation :

Microsoft ASP.NET MVC 3 - 2
Cette installation crée le répertoire : C:\Program Files\Microsoft ASP.NET et l’arborescence de fichiers suivante :

ASP.NET MVC 3 - Fichiers d'installation
C'est encore bien déroutant non ? On parlais de MVC 3 et l'on se retrouve avec un répertoire nommé MVC 4 pourtant MVC 4 existe bien séparément sous l'appellation ASP.NET MVC 4 pour Visual Studio 2010 SP1 et Visual Web Developer 2010 SP1.

En comparant les System Requirements des deux versions :

MVC 3

Supported Operating System
Windows 7, Windows Server 2003, Windows Server 2008, Windows Server 2008 R2, Windows Vista, Windows XP
.NET 4, ASP.NET 4, Visual Studio 2010 or Visual Web Developer 2010 are required to use certain parts of this feature.

MVC 4

Système d'exploitation pris en charge
Windows 7; Windows Server 2003 R2 (32-Bit x86); Windows Server 2003 R2 x64 editions; Windows Server 2003 Service Pack 2; Windows Server 2008; Windows Server 2008 R2; Windows Vista Service Pack 2; Windows XP Service Pack 3
PowerShell 2.0, .NET 4, ASP.NET 4 et Visual Studio 2010 SP1 ou Visual Web Developer 2010 SP1 sont requis pour pouvoir utiliser cette fonctionnalité.

On dirait que MVC 4 est une amélioration de MVC 3 pour VS 2010 SP1 ... Et ce n'est pas logique comme d'hab avec microsoft on pourrait nommer MVC 4 : MVC 3 SP1 ou SP3 ...

ASP.NET MVC 4 Installation

Une fois MVC 3 installé et bien continuons Ici.

ASP.NET MVC 4 Download
En suite après avoir pris soin de "débloquer" AspNetMVC4Setup.exe :

ASP.NET MVC 4 Install
ASP.NET MVC 4 Install - Successful





ASP.NET MVC

Développer une applications web avec une architecture MVC - Model View Controler

Le développement rapide du .NET Framework permet l'émergence de MVC et cela va très vite depuis ASP ou les applications web classiques en asp.net html .aspx et le constat qu'elles sont trop lentes (un post et c'est toutes la page qui revient de serveur). D'où l'émergence d'une architecture MVC intégrée au .NET Framework.

Comprendre la différence entre ASP.NET Web forms et APS.NET MVC, c'est ici :
http://msdn.microsoft.com/en-us/library/dd381619(v=vs.98)
Parce que les applications MVC ne maintiennent pas le ViewSate (état de la vue entre deux appels serveur) il ne faut pas utiliser les contrôles de type GridView, Repeater, et DataList.

Comprendre l'exécution d'une application ASP.NET MVC, c'est ici :
http://msdn.microsoft.com/en-us/library/dd381612(v=vs.98)

Razor ou Webforms ?

Peut-on utiliser les deux moteurs de rendu Razor ou WebForms ASP.NET dans une même page ?

http://www.cellenza.com/publications/introduction-a-razor-pour-asp-net-mvc/
Introduction à la syntaxe Razor pour ASP.NET MVC

La réponse est non !

Peut-on utiliser les deux moteurs de rendu Razor et WebForms ASP.NET dans un même projet ?

La réponse est Non, Oui, Peut-être mais cela n'est pas supporté. Quoi qu'il en soit voici quelques techniques :
Vous partez d'une ancienne application web .aspx et vous voulez introduire un peu de razor c'est à dire quelques vues en .cshtml, voici comment faire, ici :
http://www.mikesdotnetting.com/Article/162/Using-Web-Pages-Helpers-in-ASP.NET-Web-Forms

Autres techniques plus complexes, ici :
http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

La véritable solution est probablement dans MvcScaffold.

ASP.NET MVC 3

ASP.NET MVC 3 fournit une infrastructure MVC (Model-View-Controller) au-dessus du runtime ASP.NET 4.

Download
http://www.microsoft.com/en-us/download/details.aspx?id=1491
http://www.microsoft.com/fr-fr/download/details.aspx?id=1491
MVC 3 pour Visual Studio 2010

http://www.asp.net/mvc/mvc3
ASP.NET MVC 3 est un framework pour construire des applications Web évolutives, basées sur les standards en utilisant des modèles de conception (design partterns) bien établies et la puissance de ASP.NET et du .NET Framework.

Avec MVC 3 on passe au moteur de rendu Razor ...

Support de multiples moteurs de rendu ...
Avec l'arrivée de Razor on peut facilement imaginer que les autres moteurs de rendu son amenés à disparaitre.

MvcScaffolding

http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/
Scaffold your ASP.NET MVC 3 project with the MvcScaffolding package
Permet lors de la création d'une classe de créer l'ensemble des formulaires permettant de réaliser un Create-Read-Update-Delete (CRUD).
Dans la Package Management Console taper la commande :
PM> Scaffold controler MaClass

Le lien vers le blog de Steven Anderson comporte 7 points ...

Moteur de rendu Razor

http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx
Introducing “Razor” – a new view engine for ASP.NET

http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx
ASP.NET MVC 3: New @model keyword in Razor

http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx
ASP.NET MVC 3: Layouts with Razor

http://www.asp.net/web-pages/overview/more-resources/asp-net-web-pages-api-reference
This page contains a list with brief examples of the most commonly used objects, properties, and methods for programming ASP.NET Web Pages with Razor syntax.
...

ASP.NET MVC 4

http://www.asp.net/whitepapers/mvc4-release-notes

http://wildermuth.com/2012/1/18/Modern_Web_Development_-_Part_1
Modern Web Devlopment, how to make Razor and HTML5 web application using Visual Studio
Suppression des JS Microsoft, utilisation de NuGet pour installer JQuery UI.
Ajouter un nouveau controller par bouton droit sur le répertoire Controllers de la solution puis Add puis New Controller.
Ajouter une vue en éditant le C# du  nouveau controller puis bouton Add View...