7

我正在尝试将图像和样式表从用户控件移动到程序集中的嵌入资源。我使用 Reflector 看到图像和 .css 文件嵌入在程序集中,但是当我尝试使用 ClientScript.GetWebResourceUrl() 创建的 URL 访问它们时,找不到资源。我难住了。

程序集默认命名空间:

TestWebApp

文件的路径(标记为 BuildAction: Embedded Resource)是

TestWebApp/Resources/CSS/PaymentHistory.css
TestWebApp/Resources/Images/loading.gif

所以我的资源注册为:

[assembly: WebResource("TestWebApp.Resources.CSS.PaymentHistory.css", "text/css", PerformSubstitution = true)]
[assembly: WebResource("TestWebApp.Resources.Images.loading.gif", "image/gif")]

访问资源的用户控件(在同一程序集中):

TestWebApp.UserControls.PaymentHistory

为了简化,我目前只是试图引用图像而不是样式表。在我的用户控件的 Page_Load 中,我将 Image 控件的 ImageUrl 设置为资源 URL:

image1.ImageUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(), "TestWebApp.Resources.Images.loading.gif");

在运行时,一切似乎都可以正常工作,但会呈现损坏的图像。这是渲染的图像源:

<img style="border-width:0px;" src="/WebResource.axd?d=8fC_1tLPjrUCxmFc_Q2MKY0-pHAak-sTWkpLLV3D56H_c08LujXC63ia2PNICE65_i-Q4JqprAigLpbrXG-rIAr6ePO4HHcdQKgdd3szlThv2gizxOJLJsPRNe-b_M6ApTwPsH_5oZAuONTN0cumOTRr1nA1&amp;t=635133745137507721" id="ph1_image1">

如果我在浏览器中导航到该 URL,我会收到 404,找不到资源。我究竟做错了什么?

编辑: 一定有一些基本的东西我不理解和/或我正在做一些非常愚蠢的事情。这是一个简单的 VS 2010 示例。我已经按照我知道的所有必需的步骤嵌入 JScript1.js 并通过 WebResource.axd 访问它,但它得到了错误。

4

4 回答 4

12

在示例项目的 Default.aspx.cs 文件中,更改this.GetType()typeof(_Default)

Page.ClientScript.RegisterClientScriptInclude("JScript1",
    Page.ClientScript.GetWebResourceUrl(typeof(_Default), "EmbeddedResources.JScript1.js"));

同样,在 PaymentHistory.ascx.cs 文件中,更改this.GetType()typeof(PaymentHistory)

image1.ImageUrl = Page.ClientScript.GetWebResourceUrl(
    typeof(PaymentHistory), "TestWebApp.Resources.Images.loading.gif");

说明: GetWebResourceUrl查看type参数以确定哪个程序集包含嵌入的资源。指定this.GetType()type是不正确的,因为在 .aspx 或 .ascx 代码隐藏类中,不是this.GetType()指该类,而是指从 .aspx 或 .ascx 标记动态生成的派生类。此派生类驻留在单独的程序集中,因此找不到嵌入的资源。GetWebResourceUrl

于 2013-09-01T18:11:08.230 回答
1

资源是在一个单独的项目中还是与您的用户控件在同一个项目中?如果是单独的,则必须将 this.GetType() 替换为位于单独项目中的对象的 GetType() 函数。

如果在同一个项目中,只需执行 Page.GetType(),因为您需要对页面的引用而不是用户控件

于 2013-08-29T20:06:45.497 回答
1

首先,您传递给 GetWebResourceUrl 调用(或我在下面显示的 RegisterClientScriptResource)的类型实际上指向哪个程序集包含您的资源。问题是“this.GetType()”返回的类型不在当前执行的程序集中(这可能很奇怪)。

以下 2 行说明了该问题。

        Response.Write(this.GetType().Assembly.FullName + "<br>");
        Response.Write(Assembly.GetExecutingAssembly().FullName + "<br>");

第一行返回“App_Web_??????”的名称 部件。第二个返回预期的“EmbeddedResources”程序集。

在下面的调用中,我只传入从执行程序集返回的第一种类型,调用就可以工作了。Page.ClientScript.RegisterClientScriptResource(Assembly.GetExecutingAssembly().GetTypes()[0], names[0]);

this.GetType() 实际上返回 Web 服务器创建的从您的类型继承的类型。这就是为什么 typeof(_Default) 也可以指定正确的程序集的原因。

于 2013-09-03T13:39:46.100 回答
0

在这里,您可以看到 Vb.NET 中的代码,它使用反射库来检测当前的程序集名称和当前的命名空间。

如果您将命名空间与嵌入的图像名称连接起来,您可以使用命令 Page.clientScript.GetWebResourceURL 为图像生成一个链接,如您在第一个函数中看到的那样

在第二个函数中,您会在所有资源名称中看到一个循环,直到找到嵌入资源的完整名称。

Friend Class ReadResources

    ' Get our assembly.
    Private Shared executingAssembly As System.Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()

    ' Get our namespace.
    Private Shared myNamespace As String = executingAssembly.GetName().Name.ToString()

    ''' <summary>
    ''' Generate resource link
    ''' </summary>
    Friend Shared Function GetResourceLink(ByVal ref As String,
                                           ByVal obj As Object,
                                           ByVal page As Web.UI.Page) As String
        Dim out As String = Nothing
        out = Page.ClientScript.GetWebResourceUrl(obj.GetType, myNamespace & "." & ref)

        If out Is Nothing OrElse out.Length <= 0 Then
            out = FindResource(ref, obj)
        End If

        Return out
    End Function

    Friend Shared Function FindResource(ByVal reference As String,
                                        ByVal obj As Object) As String
        Dim out As String = ""
        For Each embedded In obj.GetType().Assembly.GetManifestResourceNames()
            If embedded.Contains(reference) Then
                out = embedded
                Exit For
            End If
        Next
        Return out
    End Function


End Class
于 2015-03-18T17:54:17.670 回答