2009-10-27 14 views
3

Bonjour J'ai du mal à faire fonctionner un fichier js intégré.Raisons pour lesquelles WebResources est introuvable

J'ai essayé tous les éléments suivants:

  • Exécuter un serveur de développement Cassini (VS2008, .NET 3.5)
  • Ajouté [Assemblée: WebResource ("MyNamespace.MyScriptFile.js", « text/javascript ")] au-dessus de la déclaration d'espace de noms de la classe.
  • Le fichier script a une action de construction "Embedded Resource". Essayé d'enregistrer pendant OnInit, OnLoad et OnPreRender
  • Le fichier de script se trouve dans le même assembly et le même espace de noms que le contrôle l'enregistrant.
  • L'assembly ouvert avec Reflector et vérifié le nom de la ressource est correct.
  • ne fonctionne pas en utilisant l'une des méthodes suivantes:

    ScriptManager.RegisterClientScriptResource(Page, GetType(), "MyNamespace.MyScriptFile.js"); 
    
    Page.ClientScript.RegisterClientScriptResource(GetType(), "MyNamespace.MyScriptFile.js"); 
    
    Page.ClientScript.RegisterClientScriptInclude(GetType(), "key", 
        Page.ClientScript.GetWebResourceUrl(GetType(), "MyNamespace.MyScriptFile.js")); 
    
    • D'autres fichiers webresource.axd sont trouvés - que celui-ci n'est pas trouvé.

La demande de la ressource renvoie une page 404 à l'exception indiqué: "*[HttpException]: This is an invalid webresource request.*"

Utilisation du produit ScriptManager.RegisterClientScriptResource l'exception:

"*Web resource 'MyNamespace.MyScriptFile.js' was not found.*" 

Répondre

1

Essayez la mise en œuvre de votre propre ScriptManger et puis en ajoutant le fichier incorporé à partir de là. Voici un exemple

public class MyScriptManager : System.Web.UI.ScriptManager 
{ 
    protected override void OnInit(EventArgs e) 
    { 
      base.OnInit(e); 
      RegisterClientScriptResource(this, typeof(ScriptManagerExtension), "MyNamespace.MyScriptFile.js"); 
    } 
} 
+3

Cela peut fonctionner, mais l'un des objectifs de l'utilisation de ressources intégrées est que vous pouvez empaqueter des fichiers javascript dans des assemblages qui sont ensuite envoyés à différents projets. Les ressources peuvent ensuite être ajoutées dynamiquement par les contrôles qui en ont besoin.Si je dois créer mon propre ScriptManager, le but de l'utilisation d'une ressource intégrée est en quelque sorte vaincu. – cbp

+0

Je ne suis pas d'accord avec cette évaluation. Avoir votre propre gestionnaire de scripts est un moyen d'abstraire le besoin de "chaînes magiques". Si vous devez l'écrire plus d'une fois, "MyNamespace.MyScriptFile.js" serait une chaîne magique. Si j'étais vous, j'utiliserais cette approche simplement parce qu'elle permet la réutilisation et qu'elle remplit votre but, non? – zowens

+0

J'ai essayé votre solution et cela fonctionne - merci! J'ai plutôt utilisé ScriptManagerProxy pour pouvoir empaqueter et distribuer la ressource intégrée correctement. – cbp

2

peut-être que votre fichier de ressources se trouve dans le (s) dossier (s) du projet? le cas échéant, vous devez spécifier une autre chaîne nom/emplacement dans l'assemblage et lorsque vous enregistrez le script

Page.ClientScript.RegisterClientScriptResource(GetType(), "MyNamespace.Folder1.Folder2.MyScriptFile.js"); 

[assembly: WebResource("MyNamespace.Folder1.Folder2.MyScriptFile.js", "text/javascript")] 

habituellement c'est un problème commun

+0

Bon point, mais malheureusement, il est dans le répertoire racine. – cbp

3

Dans votre exemple de code, vous faites un appel à GetType() ... le type est utilisé comme point de départ pour la recherche. Selon l'endroit où vous appelez GetType(), il se peut que vous ne récupériez pas ce que vous attendiez. Comme ASP.NET compile dynamiquement des types pour vos pages et vos contrôles personnalisés, GetType() peut renvoyer un type défini dans un nouvel assembly créé par ASP.NET.

Vous pouvez essayer plutôt de typeof (SomeType), où SomeType est approprié en fonction de l'emplacement de votre ressource (par exemple le type de contrôle avec lequel vous travaillez).

+0

Merci. Il a résolu mon problème où j'ai hérité d'un de mes contrôles. Apparemment GetType() renvoie le type du contrôle hérité et non le type du contrôle de base ajoutant le script. – Jeroen

+0

vous venez de sauver ma journée! – gsharp

0

Une autre cause de ce problème - vous avez été trop lourd avec votre Global.asax, et vous avez dit que tout le reste après vos règles vous donne la page d'accueil. Pas si intelligent de moi, une heure ou deux gaspillés là-dessus!