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て、どのアセンブリに埋め込みリソースが含まれているかを判断します。.aspx または .ascx 分離コード クラスでは、 はそのクラスではなく、.aspx または .ascx マークアップから動的に生成される派生クラスを参照するため、this.GetType()として指定することは正しくありません。この派生クラスは別のアセンブリに存在するため、埋め込まれたリソースが見つかりません。typethis.GetType()GetWebResourceUrl

于 2013-09-01T18:11:08.230 に答える
1

リソースは別のプロジェクトにありますか、それともユーザー コントロールと同じプロジェクトにありますか? 別の場合は、別のプロジェクトに存在するオブジェクトの GetType() 関数で this.GetType() を置き換える必要があります。

同じプロジェクト内の場合は、ユーザー コントロールではなくページへの参照が必要なため、Page.GetType() を実行するだけです。

于 2013-08-29T20:06:45.497 に答える
0

ここでは、Reflection ライブラリを使用して現在のアセンブリ名と現在の NameSpace を検出する Vb.NET のコードを確認できます。

名前空間を埋め込み画像名と連結すると、コマンド Page.clientScript.GetWebResourceURL を使用して、最初の関数で見られるように画像へのリンクを生成できます。

2 番目の関数では、埋め込みリソースの完全な名前が見つかるまで、すべてのリソース名でループが発生します。

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 に答える