【问题标题】:How to embed a static image resource in a web server control?如何在 Web 服务器控件中嵌入静态图像资源?
【发布时间】:2011-01-16 22:12:08
【问题描述】:

我将创建一个表示树视图的 Web 服务器控件。所以我想用 2 张图片来表示 + 和 - 来展开/折叠。如何将其构建到控件中,以便在页面上呈现时可以用作图像源?

由于这将在已编译的 Web 控件库中,我不想依赖 Web 应用程序中的外部图像。

编辑:
基于 Andre Kraemerthis answer,我做了以下事情:

在 AssemblyInfo.vb 中:

<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")> 
<Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.minus.gif", "image/gif")> 

在我的RenderContents 覆盖:

Dim lPlusImage As New WebControls.Image()
Dim lMinusImage As New WebControls.Image()
lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.plus.gif")
lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.Resources.minus.gif")
lPlusImage.RenderControl(output)
lMinusImage.RenderControl(output)

我的大会名称是MyWebControls

我的根命名空间是MyCompany.MyWebControls

图像plus.gifminus.gif 位于名为Resources 的文件夹中,图像的Build Action 设置为Embedded Resource

还是不行。我没有错误。我已经直接在浏览器中尝试了生成的图片url,bot什么也没有发生,只是一个空白页。

注意:
我尝试在资源名称中使用无效路径,结果完全一样,这让我想知道是否需要做一些特殊的事情来将实际资源映射到资源名称。仅当我在代码中使用的名称与 AssemblyInfo 中指定的名称不同时,才会出现 404 Not Found 错误,它与指向实际资源的路径无关!

编辑:

我找到了solution

我发现这是 C# 和 VB 之间的区别。看到我自己的answer 这个问题。

【问题讨论】:

    标签: asp.net vb.net image embedded-resource servercontrols


    【解决方案1】:

    将这两个图像添加到树视图控件项目的名为 images 的子文件夹中。然后将属性网格中的构建操作从内容更改为嵌入资源。

    除此之外,您还必须在 assemblyinfo.cs 文件中将这两个图像注册为您的程序集的嵌入式资源,如下所示:

    [assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.plus.gif", "img/gif")]
    [assembly: System.Web.UI.WebResource("YourProjectsNameSpace.Images.minus.gif", "img/gif")]
    

    由于这些图像现在将嵌入到您的控件程序集中,您可以使用 ClientScriptManager 访问它们,如下所示:

    string plusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.plus.gif");
    string minusImageUrl  = Page.ClientScript.GetWebResourceUrl(this.GetType(), "YourProjectsNameSpace.Images.minus.gif");
    

    【讨论】:

    • 我试过这个,但图像没有显示在浏览器中。顺便说一句,我使用的是 VB,而不是 C#,但我认为这不会有太大的不同(语法除外)。
    • 您是否收到某种错误消息,或者图片只是不显示?你有没有看一下 plusImageUrl 和 minusImageUrl 是否由代码分配?如果是这样,您是否尝试将这些网址复制到浏览器的地址栏并直接打开它们?
    • 如果我直接在浏览器中尝试这个 url,什么都不会显示(甚至没有错误)。
    • 这很奇怪。如果您安装了 firefox 并安装了 firebug:您能否查看 firebug 中的网络选项卡,以了解直接在浏览器中请求图片 url 时发生了什么?
    • 好的,我在weblogs.asp.net/istofix/archive/2008/10/21/… 找到了解决方案。看来C#和VB毕竟还是有区别的……
    【解决方案2】:

    好的,我在this article 找到了答案。我认为 Andre Kraemer 是公认的答案,因为他为我指明了正确的方向。他不知道C#和VB的名字结构有细微的差别!

    这是适用于 VB 的解决方案:

    重要的区别在于,在 VB 中,文件路径不包含在名称中。

    在我的示例中,项目中的根命名空间是MyCompany.MyWebControls,图像文件位于名为Resources 的子文件夹中。在 C# 中,子文件夹是资源名称结构的一部分,但在 VB 中不是。

    在 C# 中,这将是:

    [assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.Resources.plus.gif", "image/gif")]
    

    在VB中,我们必须忽略资源名称路径中的文件路径:

    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 
    

    所以当我们知道这一点时,我的完整示例将是:

    在 AssemblyInfo.vb 中:

    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.plus.gif", "image/gif")> 
    <Assembly: System.Web.UI.WebResource("MyCompany.MyWebControls.minus.gif", "image/gif")> 
    

    在我的RenderContents 覆盖:

    Dim lPlusImage As New WebControls.Image()
    Dim lMinusImage As New WebControls.Image()
    lPlusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.plus.gif")
    lMinusImage.ImageUrl = Page.ClientScript.GetWebResourceUrl(Me.GetType(), "MyCompany.MyWebControls.minus.gif")
    lPlusImage.RenderControl(output)
    lMinusImage.RenderControl(output)
    

    瞧,它起作用了!

    【讨论】:

      【解决方案3】:

      您的图像 -> 属性 -> 构建操作 -> 嵌入式资源。它将与您的控件或库一起编译。

      【讨论】:

      猜你喜欢
      • 2011-03-29
      • 2011-10-05
      • 2021-10-12
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多