在 c# 中从其他资源中引用嵌入式资源

Posted

技术标签:

【中文标题】在 c# 中从其他资源中引用嵌入式资源【英文标题】:Referencing Embedded resources from other resources in c# 【发布时间】:2010-09-07 23:18:22 【问题描述】:

在我的 Web 应用程序中,我将所有 javascript 作为 js 文件包含在程序集中的嵌入资源中,并使用 ClientScriptManager.GetWebResourceUrl() 将它们添加到页面中。但是,在我的一些 js 文件中,我引用了其他静态资产,例如图像 url。我也想制作这些组装资源。有没有办法标记对资源的引用?例如

this.drophint = document.createElement('img');
this.drophint.src = '/_layouts/images/dragdrophint.gif';

可能变成这样:

this.drophint = document.createElement('img');
this.drophint.src = 'resource:assembly.location.dragdrophint.gif';

【问题讨论】:

【参考方案1】:

我建议您将 Web 资源作为动态 javascript 关联数组发出。

服务器端代码:

StringBuilder script = new StringBuilder();
script.Append("var imgResources = ;");
script.AppendFormat("imgResources['0'] = '1';", 
    "drophint", 
    Page.ClientScript.GetWebResourceUrl(Page.GetType(), "assembly.location.dragdrophint.gif"));
script.AppendFormat("imgResources['0'] = '1';", 
    "anotherimg", 
    Page.ClientScript.GetWebResourceUrl(Page.GetType(), "assembly.location.anotherimg.gif"));

Page.ClientScript.RegisterClientScriptBlock(
    Page.GetType(),
    "imgResources",
    script.ToString(), 
    true);

那么您的客户端代码如下所示:

this.drophint = document.createElement('img');
this.drophint.src = imgResources['drophint'];
this.anotherimg = document.createElement('img');
this.anotherimg.src = imgResources['anotherimg'];

希望这会有所帮助。

【讨论】:

【参考方案2】:

我并不特别关心@Jon 建议的确切实现,但它背后的想法是合理的,我同意发布这些将是一件好事。

一个稍微好一点的实现,虽然这在某种程度上都是主观的,但会创建一个服务器端模型(阅读:C# class(es))来表示这个字典(或者简单地使用 Dictionary) 并将其序列化为 JavaScript 文字对象表示法。这样一来,您就不会处理您在 Jon 的示例中看到的字符串黑客攻击(如果这让您感到困扰)。

【讨论】:

【参考方案3】:

我同意 Jason 对我提出的初始解决方案的评估,它绝对可以改进。我的解决方案代表了一种老派的 javascript 心态(阅读,在 ajax 和 JSON 出现之前)。总有更好的方法来解决问题,这也是 *** 如此酷的原因之一。总的来说,我们比任何人都更擅长编程。

根据 Jason 的想法,我会修改我的初始代码,并修改 Jason 建议的一些内容。实现一个具有两个属性的C# 类,img 资源id 和一个包含WebResourceUrl 的属性。然后,我与 Jason 的一些不同之处在于,我建议使用 List<MyImageResourceClass>,而不是使用 Dictionary<string, string>,然后您可以将其序列化为 JSON(使用 DataContractJsonSerializer),并将 JSON 作为动态脚本,而不是使用字符串生成器手动生成 javascript。

为什么是列表?我认为您可能会在序列化为 JSON 时找到字典,至少使用DataContractJsonSerializer(仅供参考,仅适用于 3.5 框架,使用 2.0 或 3.0 框架,您需要使用 aspnet ajax 并使用 JSON 序列化程序),使用起来比列表如何序列化要麻烦一些。虽然这是主观的。

您的客户端代码也有影响。现在在客户端,您将拥有一个 JSON 序列化 MyImageResourceClass 实例的数组。你需要遍历这个数组来创建你的img标签。

希望这些想法和建议可以帮助您前进!毫无疑问,还有其他解决方案。我有兴趣看看会发生什么。

【讨论】:

以上是关于在 c# 中从其他资源中引用嵌入式资源的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从项目的资源区域加载图像

如何在HTTPS 网页中引入HTTP资源

如何通过其他资源获取引用资源的ID?

C# 应用程序中的资源和嵌入式资源有啥区别?

如何在 Spring Boot 中从资源服务器中的令牌中提取声明

在 C# 中循环访问不同语言/文化的嵌入式资源