【问题标题】:Reasons why WebResources cannot be found找不到 WebResources 的原因
【发布时间】:2013-12-17 20:51:40
【问题描述】:

您好,我无法让嵌入式 js 文件正常工作。

我已经尝试了以下所有方法:

  • 运行 Cassini 开发服务器(VS2008、.NET 3.5)
  • 在类的命名空间声明上方添加了 [assembly: WebResource("MyNamespace.MyScriptFile.js", "text/javascript")]
  • 脚本文件具有构建操作“嵌入式资源”。
  • 尝试在 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.*"

【问题讨论】:

    标签: asp.net webresource


    【解决方案1】:

    在您的示例代码中,您正在调用 GetType()... 该类型用作搜索的起点。根据您调用 GetType() 的位置,您可能无法获得预期的结果。由于 ASP.NET 会为您的页面和自定义控件动态编译类型,因此 GetType() 可能会返回在 ASP.NET 构建的新程序集中定义的类型。

    您可以尝试改用 typeof(SomeType),其中 SomeType 根据您的资源位置(例如您正在使用的控件类型)是合适的。

    【讨论】:

    • 谢谢。它解决了我从我的一个控件继承的问题。显然 GetType() 返回继承控件的类型,而不是添加脚本的基本控件的类型。
    • 你拯救了我的一天!
    【解决方案2】:

    也许您的资源文件位于项目的文件夹中? 如果是这样,您应该在程序集中和注册脚本时指定另一个名称/位置字符串

    Page.ClientScript.RegisterClientScriptResource(GetType(), "MyNamespace.Folder1.Folder2.MyScriptFile.js");
    
    [assembly: WebResource("MyNamespace.Folder1.Folder2.MyScriptFile.js", "text/javascript")]
    

    通常这是一个常见的问题

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这可能有效,但使用嵌入式资源的目的之一是您可以将 javascript 文件打包成程序集,然后将它们运送到不同的项目。然后可以由需要它们的控件动态添加资源。如果我必须制作自己的 ScriptManager,那么使用嵌入式资源的目的就有点落空了。
      • 我不同意这种评价。拥有自己的脚本管理器是一种抽象出对“魔术字符串”需求的方法。如果您必须多次编写它,“MyNamespace.MyScriptFile.js”将是一个神奇的字符串。如果我是你,我会使用这种方法仅仅是因为它允许重用并且确实实现了你的目的,不是吗?
      • 我试用了您的解决方案,它正在工作 - 谢谢!我使用了 ScriptManagerProxy,以便我可以正确打包和分发嵌入的资源。
      【解决方案4】:

      此问题的另一个原因 - 您对 Global.asax 的处理过于繁重,并且您说您的规则之后的所有其他内容都会为您提供主页。我没那么聪明,浪费了一两个小时!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2022-11-24
        • 2019-12-28
        • 2018-08-04
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多