Comment ajouter une référence à System.Web.Optimization pour l'application MVC-3-convert-to-4

458

J'essaie d'utiliser la nouvelle fonctionnalité de regroupement dans un projet que j'ai récemment converti de MVC 3 en MVC 4 beta. Il nécessite une ligne de code dans global.asax BundleTable.Bundles.RegisterTemplateBundles();, qui nécessite using System.Web.Optimization;en haut.

Lorsque je fais cela, j'obtiens les lignes rouges ondulées qui disent: "Vous manquez une référence d'assemblage?" Lorsque j'essaie d'ajouter une référence et de cliquer sur l'onglet .NET dans la boîte de dialogue, trier à partir de AZ, je ne vois pas System.Web.Optimization.

Comment ajouter cette référence à mon projet?

Ian Davis
la source
6
J'avais déjà l'optimisation mais cela causait un problème avec le ScriptBundle que je ne pouvais résoudre qu'après avoir désinstallé Opti ... puis réinstallé.
Myzifer
1
@Myzifer Vous devez soumettre votre commentaire comme réponse. C'était la seule chose qui a fonctionné pour moi de remettre le System.Web.Optimizationnœud dans mes références.
Snekse
2
@myzifer Votre réponse est la bonne pour ce comportement étrange. La seule chose qui résoudrait ce problème pour moi est d'exécuter la ligne de commande nuget: UnInstall-Package Microsoft.AspNet.Web.Optimization, puis juste après l'exécution de l'installation: Install-Package Microsoft.AspNet.Web.Optimization. J'ai essayé de faire fonctionner cela pendant des semaines sur mon ordinateur personnel avec VStudio 2013 et je n'ai jamais pu l'obtenir. Merci beaucoup.
raddevus
@Myzifer - a également fonctionné pour moi - "Checked out" un projet de VSOnline et a eu cette erreur - désinstallez puis réinstallez - 20 secondes de travail - merci - c'est l'un de ces problèmes stupides que vous pouvez facilement perdre une journée!
Percy

Réponses:

728

La mise à jour
version 1.1.x est disponible, lisez les notes de publication: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Le package Microsoft.Web.Optimization est désormais obsolète. Avec ASP.NET (MVC) 4 et supérieur, vous devez installer Microsoft ASP.NET Web Optimization Framework:

  • Installez le package à partir de nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Créez et configurez des bundles dans App_Start \ BundleConfig.cs:

    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles) {
            bundles.Add(new ScriptBundle("~/Scripts/jquery").Include(
                "~/Scripts/Lib/jquery/jquery-{version}.js",
                "~/Scripts/Lib/jquery/jquery.*",
                "~/Scripts/Lib/jquery/jquery-ui-{version}.js")
            );
    
            bundles.Add(new ScriptBundle("~/Scripts/knockout").Include(
                 "~/Scripts/Lib/knockout/knockout-{version}.js",
                 "~/Scripts/Lib/knockout/knockout-deferred-updates.js")
            );
        }
    }
  • Appelez la fonction RegisterBundles () à partir d'Application_Start () dans votre global.asax.cs:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • Dans votre view.cshtml, incluez l'espace de noms Optimization et rendez le (s) bundle (s):

    @using System.Web.Optimization
    
    @Scripts.Render("~/Scripts/jquery")
    @Scripts.Render("~/Scripts/knockout")

Voir http://www.asp.net/mvc/overview/performance/bundling-and-minification pour plus d'informations

mhu
la source
2
Avez-vous besoin de MVC4 pour l'utiliser?
FloatLeft
5
Ce n'est pas obsolète. C'est ainsi que je l'utilise avec les versions finales de Visual Studio 2012 et ASP.NET (MVC) 4.
mhu
29
Votre réponse comprend «l'utilisation de System.Web.Optimization;», ce qui est exactement la question sur laquelle l'interrogateur pose la question.
davidpricedev
9
@dave: Est-ce bon ou mauvais? Pour résoudre la «référence d'assembly manquante», Microsoft.AspNet.Web.Optimization doit être installé comme indiqué dans la réponse.
mhu
6
dans le modèle MVC par défaut, je pouvais utiliser la classe Scripts sans ajouter l'espace de noms System.Web.Optimization en haut de la page. Mais dans mon pronostic, j'obtiens l'erreur "le nom des scripts n'existe pas". Comment puis-je résoudre ce problème? L'ajout de cet espace de noms dans web.config n'a pas aidé. Edit: la solution de rechargement a aidé, désolé :)
Wachburn
83

Avec la version finale publiée d'ASP.Net MVC 4, l'approche est la suivante:

  • Installez Microsoft.AspNet.Web.Optimization via nuget (car il n'est pas installé par le framework)

    install-package Microsoft.AspNet.Web.Optimization
  • Créez le bundle dans Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Ajoutez l'espace de noms "System.Web.Optimization" au web.config "Vues":

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • Dans votre view.cshtml, ajoutez une inclusion au bundle créé à la dernière étape:

    @Scripts.Render("~/MyBundle")

En mode débogage, tous les fichiers de script de votre répertoire s'affichent individuellement; en mode release, ils seront regroupés et minifiés.

Noel Abrahams
la source
Exact, cette version l'inclut. L'autre version ne fonctionne pas.
Luke Belbina
1
Je ne comprends pas pourquoi cela ne fonctionne pas pour moi. J'ai essayé à la fois de cette façon et de créer le bundle dans BundleConfig.cs mais quand j'ajoute @ Styles.Render ("~ / CssBundle") à mon avis, tout ce que j'obtiens est <link href = "/ CssBundle" rel = "feuille de style "/> cela me donne 404. Une idée pourquoi?
vsdev
@vsdev Je sais que c'est 4 ans trop tard, mais vous devrez peut-être vérifier vos BundleConfig.cs pour vous assurer que vous l'ajoutez correctement - la ligne de cette réponse fait uniquement référence aux ".js"fichiers. À l'intérieur, public static void RegisterBundles(BundleCollection bundles) { ... }vous devriez pouvoir faire quelque chose comme bundles.Add(new StyleBundle("~/CssBundle"));ça et il saisirait tous les fichiers CSS dans votre CssBundledossier. Vous ne voulez pas ScriptBundlecomme dans l'exemple pour les fichiers CSS.
vapcguy
17

Mettez à jour (réinstallez) le paquet depuis nuget, vous pouvez utiliser la commande:

update-Package Microsoft.AspNet.Web.Optimization -reinstall

M. Salah
la source
14

Dans mon cas, c'était un problème avec tfs, car tfs exclut les binaires, donc le Nugget PM trouve le nugget installé et ne met pas à jour la bibliothèque Si vous avez un problème similaire:

  • Aller au contrôle de code source
  • Accédez à .. \ packages \ Microsoft.Web.Optimization
  • Ajouter un dossier lib (décochez les extensions binaires exclues)
  • Mettez à jour votre solution et ajoutez la référence dll à partir du chemin

NB: le dossier du package est au même niveau que le fichier yousolution.sln

amine
la source
11

Utilisation de nuget pour désinstaller System.Web.Optimization dans la console du gestionnaire de packages comme ceci:

Uninstall-Package Microsoft.AspNet.Web.Optimization

Puis réinstallez en utilisant:

Install-Package Microsoft.AspNet.Web.Optimization

Peut résoudre ce problème pour vous.

Myzifer
la source
1
Vous ne savez pas comment cela répond à la question?
TylerD87
@ TylerD87 Simple, cela résout un ensemble particulier de circonstances et je ne suis pas le seul à avoir trouvé que c'était le cas, si vous lisez les commentaires sur la question, vous remarquerez que Snekse a déclaré le 29 avril 14 à 16:39 que ils devaient suivre les instructions particulières que j'ai données et que quelqu'un d'autre a posté la même chose beaucoup plus tard et a été voté.
Myzifer
Peut-être modifier votre réponse pour qu'elle ressemble plus à une réponse? Je ne savais même pas que vous répondiez à la question ou à ce que vous proposiez.
TylerD87
@ TylerD87 La question portait sur l'optimisation et ma réponse portait sur l'optimisation, elle résout le problème détaillé dans la question et a été reconnue par au moins 2 autres personnes, si vous souhaitez fournir des détails sur la manière exacte dont vous avez mal compris ma réponse et la meilleure façon Je pourrais le modifier / l'amender pour fournir à un public plus large une réponse plus claire, alors je serais heureux d'apporter de tels changements, mais sans critique constructive, je ne suis pas en mesure de déterminer comment je pourrais m'améliorer.
Myzifer
Salut, j'ai suggéré une modification qui rend plus clair ce à quoi je faisais référence. Après avoir lu les commentaires en haut, je vois que c'est en fait la suggestion qui a fonctionné, mais la façon dont votre réponse a été présentée n'était pas claire sur ce que vous proposiez réellement.
TylerD87
6

Installez-le depuis NUGet via Visual Studio Ouvrez Visual Studio 2010, sélectionnez Outils-> Library Package Manager-> Package Manager Console

Cela ouvrira le conslve, collez

Install-Package Microsoft.AspNet.Web.Optimization 

et entrez. et vous avez terminé

Mian
la source
2

défini dans Global.asax application_start (en mode RELEASE, etc.):

BundleTable.EnableOptimizations = **true**;

pour activer la minification et passer à false en mode DEBUG pour rendre tous les fichiers de script et de style individuellement.

Zenichi
la source
5
Il est plus facile de contrôler cela via le web.config. Si <compilation debug="true" />est défini (ce qui est assez standard lors de la construction d'une version de débogage), aucune optimisation n'a lieu. Normalement, ce paramètre est automatiquement supprimé dans une version de version. BundleTable.EnableOptimizationsne doit être utilisé que pour remplacer le web.config. Pour plus d'informations: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (recherchez "Contrôle du regroupement et de la minification")
mhu
Cela m'a beaucoup aidé, merci. J'ai dû le désactiver parce que travailler avec dotless + RequestReduce rendait les paquets désordonnés.
siva.k
Ce paramètre dépend vraiment de si vous utilisez des fichiers prédéfinis dans vos bundles, ou si vous utilisez des fichiers non minifiés - pas tellement si vous êtes dans Debug ou Release, sauf pour les meilleures pratiques pour chacun de ces modes - ex. , vous pouvez avoir un projet que vous compilez en mode débogage, mais où vous en avez BundleTable.EnableOptimizations = false;parce que dans vos BundleConfig.cs, vous spécifiez tous les fichiers prédéfinis et vous ne voulez pas qu'il fasse une autre minimisation sur eux.
vapcguy
Ce ne serait vraiment la réponse au problème de quelqu'un que s'il utilisait des fichiers non minimisés (c'est-à-dire des fichiers SANS .min) dans son BundleConfig.cs. S'ils utilisaient des fichiers .min et le définissaient sur vrai, cela aurait des problèmes.
vapcguy