MVC 4 @Scripts «n'existe pas»


201

Je viens de créer un projet ASP.NET MVC 4 et j'ai utilisé Visual Studio 2012 RC pour créer un contrôleur et des vues de rasoir pour Indexet des Createactions.

Lorsque je suis arrivé pour exécuter l'application et que j'ai accédé à la Createvue, l'erreur suivante s'est produite:

Message d'erreur du compilateur: CS0103: le nom «Scripts» n'existe pas dans le contexte actuel

Le problème est le code suivant qui a été ajouté automatiquement au bas de la vue:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Pourquoi les scripts n'existent-ils pas?

J'ai regardé la classe de page Web de base dans Assembly System.Web.Mvc.dll, v4.0.0.0

Je peux voir les propriétés d'assistance suivantes disponibles:

  • Ajax
  • Html
  • URL

Mais rien ne s'appelle Scripts.

Des idées?

ÉDITER:

Mon fichier Web.config ressemble à ceci (intact de celui créé par Visual Studio):

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

EDIT # 2:

Les gens bloguent sur l'utilisation de l' @Scriptsaide:

Pourtant, après avoir installé Visual Studio 2012 RC sur une nouvelle installation de Windows 8, je ne peux toujours pas l'utiliser @Scriptsmême si Visual Studio l'ajoute à la vue générée!

Les solutions sont présentées ci-dessous.

Je ne sais pas comment fermer cela, car au final, une mise à jour a semblé résoudre le problème. J'ai revérifié que j'avais effectué une installation propre, en utilisant un nouveau projet. Mais le même projet défaillant que j'avais fait fonctionne bien maintenant après diverses mises à jour et aucune intervention manuelle évidente. Merci pour toutes ces réflexions mais il y avait définitivement un problème à l'époque;)


essayez déjà d'ajouter dans Web.config? <system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> etc... </pages>
Zach dev

J'ai ajouté la section de Web.config, mais je n'ai rien changé dans ce fichier.
FantasticJamieBurns

6
Vous voulez dire le fichier "My Views \ Web.config" et non la racine de l'application web.config. En tout cas, il est incorrect et manquant <add namespace = "System.Web.Optimization" />. Avez-vous installé VS12 Beta avant RC? Quelle version win8?
RickAndMSFT

@RickAndMSFT J'ai fait une installation Win8 propre à partir de l'ISO Release Release, ainsi qu'une installation à partir de l'ISO VS 2012 RC, pour m'assurer absolument qu'il ne s'agissait pas d'un conflit de versions.
FantasticJamieBurns

@RickAndMSFT Mes vues \ Web.config manqueraient toutes les vues dans les zones
Maslow

Réponses:


269

La clé ici est d'ajouter

 <add namespace="System.Web.Optimization" /> 

aux DEUX fichiers web.config. Mon scénario était que j'avais la référence System.Web.Optimization dans le projet et le web.config principal / racine mais @Scripts ne fonctionnait toujours pas correctement. Vous devez ajouter la référence de l'espace de noms au fichier Views web.config pour le faire fonctionner.

METTRE À JOUR:

Depuis la sortie de MVC 4 System.Web.Optimization est désormais obsolète. Si vous commencez avec une solution vierge, vous devrez installer le package nuget suivant:

Install-Package Microsoft.AspNet.Web.Optimization

Vous devrez toujours référencer System.Web.Optimization dans vos fichiers web.config. Pour plus d'informations, consultez cette rubrique:

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

Comme beaucoup l'ont souligné, le redémarrage de VS pourrait être nécessaire après les étapes ci-dessus pour que cela fonctionne.


8
Vous devrez peut-être également exécuter à Install-Package Microsoft.AspNet.Web.Optimizationpartir d'un modèle ASP.NET MVC4 vierge car il n'est pas inclus par défaut.
Portman

@Portman Oui, en effet, si vous avez commencé avec un modèle de projet MVC vierge, vous devez installer le package Microsoft.AspNet.Web.Optimization.
Marko

2
Il doit seulement être ajouté dans le web.config dans le dossier Views pour moi.
user1534664

9
Telle est bien la solution. Cependant, je devais redémarrer Visual Studio pour que cela soit reconnu.
Jason Eades

4
J'ai dû l'ajouter à mon Views / Web.config, puis redémarrer Visual Studio.
Caverman

48

@Styleset @Scriptssont 2 nouveaux assistants fournis par la System.Web.Optimizationbibliothèque. Comme son nom l'indique, ils regroupent et réduisent respectivement les fichiers ou les ressources CSS et JavaScript.

Essayez d'inclure l'espace de noms System.Web.Optimizationpar @usingdirective ou viaweb.config

http://ofps.oreilly.com/titles/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

METTRE À JOUR

Microsoft a déplacé le regroupement / la minification dans un package distinct appelé Microsoft.AspNet.Web.Optimization. Vous pouvez télécharger l'assemblage à partir de nuget .

Ce message vous sera utile.


2
L'ajout de System.Web.Optimization indique "CS0234: Le nom de type ou d'espace de noms 'Optimization' n'existe pas dans l'espace de noms 'System.Web". Il n'y a aucune référence appelée System.Web.Optimization à ajouter non plus.
FantasticJamieBurns

1
L'espace de noms System.Web.Optimization est devenu obsolète depuis la réponse à cette question, essayez plutôt d'utiliser Microsoft.AspNet.Web.Optimization. Voir cette question pour plus d'informations: stackoverflow.com/questions/9475893/…
Jeremy Jarrell

3
Clarification: l' System.Web.Optimizationespace de noms n'est PAS obsolète, l' System.Web.Optimization.dllest.
Despertar

Merci! Cela fonctionne pour moi lorsque j'ai eu des problèmes avec la disposition des différentes zones.
Développeur

48

Il manquait une petite étape de ce qui précède, que j'ai trouvée sur un autre post. Après avoir ajouté

<add namespace="System.Web.Optimization" />

dans vos ~/Views/web.configespaces de noms, fermez et rouvrez Visual Studio. C'est ce que je devais faire pour que cela fonctionne.


2
Même chose ici, le redémarrage de VS a fonctionné mais avant cela, il montrait toujours l'erreur ...?
Andreas

La fermeture de VS n'était pas nécessaire dans mon cas, mais j'ai dû fermer et rouvrir la vue .cshtml que j'utilisais
joalcego

29

J'utilise des zones, et je viens de rencontrer ce problème, je viens de copier les espaces de noms du web.config racine vers le web des zones. config et ça marche maintenant !!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />

15

J'ai eu le même problème et j'ai utilisé WinMerge pour m'aider à retrouver cette trace. Mais au fur et à mesure de mes recherches, j'ai trouvé que Rick avait le billet de blog parfait pour cela.

Résumé:

  • Ajouter <add namespace="System.Web.Optimization"/>aux deux fichiers web.config
  • Courir Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • Mettre à jour le code de regroupement
  • Mettre à jour le fichier de mise en page
  • La dernière étape consiste à mettre à jour 10 autres bibliothèques. Je ne l'ai pas fait et cela a bien fonctionné. Il semble donc que vous pouvez tergiverser celui-ci (sauf si j'en ai déjà mis à jour 1 ou plusieurs). :)

Merci d'avoir répondu à ce Dan! (Et en soulignant mon blog). Sa question impliquait qu'il avait commencé avec RC, mais je pense que vous avez raison. Il vient d'ajouter un contrôleur avec RC à un projet Beta.
RickAndMSFT

Cela fait quelques semaines et vous m'avez certainement tous les deux deviné. J'ai certainement mis VS 2012 sur ma tablette qui n'avait jamais eu que Metro Apps et je l'ai vu échouer. Je vais réessayer dans une VM.
FantasticJamieBurns

Cela a fonctionné pour moi. Lisez l'article lié pour obtenir des instructions précises sur ce que vous devez faire.
Justin

11

J'ai eu le même problème:

La version System.Web.Optimization que j'utilisais était obsolète pour MVC4 RC.

J'ai mis à jour mes packages à l'aide du gestionnaire de packages dans VS 2010.

Dans ce blog MSDN , M. Andy explique comment mettre à jour votre projet MVC 4 Beta vers MVC 4 RC. La mise à jour de mes packages a permis de résoudre les scripts (en particulier l'optimisation Web):

Pour installer le dernier package System.Web.Optimization, utilisez la console du gestionnaire de packages (Outils -> Library Package Manager -> Package Manager Console) et exécutez la commande ci-dessous:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

Utilisez le fichier System.Web.Optimization inclus dans le package dans vos références.

Pour mettre à jour d'autres packages: menu Outils -> Library Package Manager -> Manage NuGet Packages for Solution.


5

Créez une nouvelle application Internet MVC 4 RC et exécutez-la. Accédez à Login qui utilise le même code

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Ce qui permet à Login.cshtml de fonctionner est le fichier Views \ Web.config (pas la version racine de l'application) contient

<namespaces>

    <add namespace="System.Web.Optimization"/>

  </namespaces>

Pourquoi votre vue Créer ne fonctionne-t-elle pas et votre connexion l'est?


Je n'utilisais pas Login - cela pourrait bien avoir été cassé à l'époque.
FantasticJamieBurns

5

Importez System.Web.Optimization en haut de votre vue de rasoir comme suit:

@using System.Web.Optimization

3

J'ai rencontré ce problème, cependant lors de l'exécution de la commande:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

J'ai reçu le message énigmatique (je dois aimer un bon jeu de mots avant la première tasse de café):

Install-Package: l'algorithme de chiffrement spécifié n'est pas pris en charge sur cette plate-forme.

Je l'exécute sur Windows XP SP3 (pas par choix) et ce que j'ai trouvé, c'est que j'ai dû suivre les instructions publiées par l'utilisateur artsnob sur le forum ASP.NET

  • Veuillez désinstaller le Nuget et essayez de le réinstaller. Si vous ne parvenez pas à le faire, connectez-vous en tant qu'administrateur.
  • Allez dans Tools => Extension Manager => Sélectionnez "Nuget Package Manager" => UnInstall
  • Réinstallez-le, en recherchant "Nuget" => Installer.
  • Si cela ne fonctionne pas, essayez d'installer la version 1.7.x comme je l'ai mentionné dans le post précédent (cela ne signifie pas, vous devez utiliser la version précédente, si cela fonctionne correctement, nous pouvons signaler ce bogue et obtenir le correctifs pour la dernière version).

Une fois que j'ai exécuté cela, je pouvais alors exécuter la ligne de commande pour mettre à jour Web.Optimization.

J'espère que cela évite à quelqu'un de creuser.


2

Ecrivez

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}

@archil Merci pour le remplacement - ce sera une bonne solution temporaire. Mais la question principale était "Pourquoi les scripts n'existent-ils pas?"
FantasticJamieBurns

@Jamie devrait-il exister? Pour autant que je me souvienne, il n'y a pas d'aide Scipts. Peut-être que vous essayez d'utiliser un assistant tiers?
archil

1
Je n'ai pas ajouté ce code moi-même - Visual Studio 2012 RC l'a ajouté lors de la création de la vue pour mon action de création. Je pense que mon MVC 4 n'est pas le bon. Cela doit fonctionner quelque part parce que Scott Hanselman fait mention de la syntaxe défaillante comme étant un nouvel ajout à MVC 4 RC: hanselman.com/blog/…
FantasticJamieBurns

1

J'ai effectué une mise à niveau de la version bêta vers la version RC et j'ai rencontré un problème de «Scripts». Surfer sur le Web et la solution finale est ce que N40JPJ a dit plus un autre workaroudn:

Copiez ce qui suit dans View \ Web.config:

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.Optimization"/>
    <add namespace="System.Web.Helpers"/>
  </namespaces>

et les éléments suivants dans View \ Shared_Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

J'espère que ça aide.


1
Il n'est pas nécessaire d'utiliser if (IsSectionDefined())sauf si vous fournissez une elseclause. Le fait que vous disiez required: falsedéjà permet de ne pas définir cette section et, dans ce cas, la section sera omise. Il s'agit donc d'un code supplémentaire inutile.
ErikE

0

Apparemment, vous avez créé un type de projet «Vide» sans dossier «Scripts». Mon conseil -créer un type de projet 'Basic' avec un dossier 'Scripts' complet.

En ce qui concerne tous les développeurs.


0

il suffit de supprimer / masquer le code de la vue de création et d'édition du rasoir de votre contrôleur.

 @section Scripts {  

   @Scripts.Render("~/bundles/jqueryval")  
 }  

0
  1. : supprimer la page d'affichage.
  2. : ajouter un espace de noms webconfig (dans le répertoire d'affichage)
  3. : créer une vue et essayer!

bonne chance...


0

Un de plus pour le pot - les âges passés à essayer de résoudre le même problème - même s'il a été défini dans le web.config pour root et la racine de Views. Il s'avère que je l'ai ajouté par erreur à l' élément <system.web><pages><namespaces>, et non à l' <system.web**.webPages.razor**><pages><namespaces>élément.

Vraiment facile de manquer ça!


0

Lorsque j'entre sur une page qui possède ce code:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Cette erreur se produit: Erreur. Une erreur s'est produite lors du traitement de votre demande.

Et cette exception est enregistrée sur mes journaux:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

J'ai essayé tous les conseils sur cette page et aucun d'eux n'a été résolu pour moi. J'ai donc regardé mon dossier Packages et j'ai remarqué que j'avais deux versions pour System.Web.Optmization.dll:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0 - 68,7KB)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0 - 304KB)

Mon projet faisait référence à l'ancienne version bêta. J'ai seulement changé la référence à la nouvelle version (69 Ko) et tout a bien fonctionné.

Je pense que cela pourrait aider quelqu'un.


0

Cela a une solution évidente. J'ai eu le même problème plus tard. Sans rapport avec les références d'assemblage ou .... Cela se produira dans l'appel hiérarchique des vues partielles MVC, lorsque vous avez des structures de page complexes. Donc, appeler / rendre chaque partie séparément sur chaque page (peut-être une page maître ou partielle) fera en sorte de ne pas voir les parties requises de la page comme le code ci-dessous:

@RenderSection("Scripts", required: false)

Cela force simplement la page à rechercher et à rendre la section associée et en cas d'échec, vous affiche un message d'erreur comme vous.

Je vous suggère donc de tracer vos pages (comme la trace de programme) du maître à tous ses partiels pour détecter les dépendances . Ce sera peut-être un travail terrible, mais aucun autre choix n'est disponible ici.

Non pas que, selon mon expérience, certaines situations conditionnelles dans la programmation empêchent de vous montrer la bonne erreur à l'origine du problème.


0

J'ai eu ce problème après avoir ajouté une zone à un projet qui n'en avait pas. Pour vous en débarrasser, copiez simplement le fichier web.config avec le dossier Vues racine dans le dossier Vues de la zone et il a commencé à fonctionner.


0

Je résous ce problème dans MvcMusicStore en ajoutant cette partie de code dans _Layout.cshtml

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

et supprimez ce code de Edit.cshtml

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Exécutez le programme inshallah fonctionnera avec vous.


0

Pour moi, cela a résolu le problème, dans la console du gestionnaire de packages NuGet, écrivez ce qui suit:

update-package microsoft.aspnet.mvc -reinstall

0

Lorsque j'ai commencé à utiliser MVC4 récemment, j'ai rencontré le problème ci-dessus lors de la création d'un projet avec les modèles vides. Étapes pour résoudre le problème.

  1. Allez TOOLS-> Library Package Manager-> Packager Manager Console Collez la commande ci-dessous et appuyez sur Entrée Install-Package Microsoft.AspNet.Web.Optimization Remarque: attendez la réussite de l'installation.
  2. Allez au fichier Web.Config au niveau racine et ajoutez l'espace de noms ci-dessous dans la section d'espace de noms des pages. ajouter<namespace="System.Web.Optimization" />
  3. Allez à Web.Config dans le dossier Vues et suivez l'étape 2.
  4. Générez la solution et exécutez.

Le package mentionné à l'étape 1 ajoutera quelques bibliothèques système dans les références de solution comme System.Web.Optimization n'est pas une référence par défaut pour les modèles vides dans MVC4.

J'espère que ça aide. Je vous remercie


0

J'ai eu une erreur très similaire lors de la mise à niveau d'un projet de MVC3 vers MVC4.

Message d'erreur du compilateur: CS0103: le nom [blah] n'existe pas dans le contexte actuel

Dans mon cas, j'avais des numéros de version obsolètes dans plusieurs de mes Web.Configs.

  1. J'avais besoin de mettre à jour le numéro de version System.Web.Mvc de "3.0.0.0" à "4.0.0.0" dans chaque Web.Config de mon projet.
  2. J'avais besoin de mettre à jour tous mes numéros de version System.Web.WebPages, System.Web.Helpers et System.Web.Razor de "1.0.0.0" à "2.0.0.0" dans chaque Web.Config de mon projet.

Ex:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

Assurez-vous de consulter le Web.Configs dans chacun de vos répertoires Views.

Vous pouvez en savoir plus sur la mise à niveau d'un projet ASP.NET MVC 3 vers ASP.NET MVC 4 .


0

Si vous avez ajouté à votre web.config et qu'il affiche toujours un message, vous devez alors fermer votre projet et le rouvrir, maintenant il existera et @ Styles.Render ("") et @ Scripts.Render () fonctionneront correctement.


-1

Essaye ça:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.