2009-10-27 80 views
3

嗨我无法使嵌入式js文件正常工作。WebResources无法找到的原因

我已经尝试了所有的以下内容:

  • 运行卡西尼开发服务器(VS2008,.NET 3.5)
  • 新增[装配:WebResource( “MyNamespace.MyScriptFile.js”,“文/ javascript“)]在类的名称空间声明之上。
  • 脚本文件具有构建操作“Embedded Resource”。
  • 在OnInit,OnLoad和OnPreRender中尝试注册
  • 脚本文件与注册它的控件在同一个程序集和命名空间中。
  • 用Reflector打开程序集并验证资源的名称是否正确。
  • 不使用任何下列方法工作:

    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")); 
    
    • 其他WebResource.axd的文件被发现 - 只有这一个不被人发现。

对资源的请求返回一个404页面中列出的除外:"*[HttpException]: This is an invalid webresource request.*"

使用ScriptManager.RegisterClientScriptResource产生异常:

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

回答

1

尝试实现自己的ScriptManger和然后从那里添加嵌入的文件。这里是一个例子

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

这可能会起作用,但使用嵌入式资源的目的之一是您可以将JavaScript文件打包到程序集中,然后将这些程序发送到不同的项目。然后可以通过需要它们的控件动态添加资源。如果我必须制作自己的ScriptManager,那么使用嵌入式资源的目的就会失败。 – cbp 2009-11-03 00:43:30

+0

我不同意这种评估。拥有自己的脚本管理器可以抽象出对“魔术串”的需求。如果你不得不多次写它,“MyNamespace.MyScriptFile.js”将是一个神奇的字符串。如果我是你,我会使用这种方法,只是因为它允许重用,它确实满足你的目的,不是吗? – zowens 2009-11-03 01:32:36

+0

我试过你的解决方案,它工作 - 谢谢!我使用了ScriptManagerProxy,以便可以正确打包和分发嵌入式资源。 – cbp 2009-11-04 06:08:53

2

也许你的资源文件位于项目中的文件夹? 如果是这样,就应该在组件中的另一名称/位置字符串,当您注册脚本

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

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

通常这是一个常见的问题

+0

好点,但遗憾的是它在根目录下。 – cbp 2009-11-04 02:28:08

3

在你的示例代码,您正在为的GetType()的调用...该类型被用作搜索的起点。根据你打电话给GetType()的位置,你可能没有回到你期望的状态。由于ASP.NET动态编译页面和自定义控件的类型,因此GetType()可能会返回由ASP.NET构建的新程序集中定义的类型。

您可以尝试使用typeof(SomeType)来代替,其中SomeType基于资源的位置(例如您正在使用的控件类型)是合适的。

+0

谢谢。它解决了我从我的控件继承的问题。 Apparantly GetType()返回继承的控件的类型,而不是添加脚本的基本控件的类型。 – Jeroen 2011-06-08 21:31:08

+0

你刚刚救了我的一天! – gsharp 2014-08-17 05:44:05

0

这个问题的另一个原因 - 你的Global.asax太过沉重了,你已经说过在你的规则给你的首页之后的一切。不是那么聪明,一两个小时就浪费了!