从C#中的其他资源引用嵌入式资源

时间:2020-03-05 18:48:25  来源:igfitidea点击:

在我的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}';

解决方案

回答

我建议我们将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'];

希望这可以帮助。

回答

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

尽管这在某种程度上是主观的,但是一个更好的实现是创建一个代表此字典的服务器端模型(阅读:Cclass(es))(或者简单地使用Dictionary <string,string>的实例),并将其序列化为JavaScript文字对象表示法。这样,我们就不必处理在乔恩(Jon)的示例中看到的字符串hacking(如果让我们感到困扰)。

回答

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

基于Jason的想法,我将修改我的初始代码,并修改Jason建议的一些内容。实现一个具有两个属性的Cclass,即img资源" id"和一个包含WebResourceUrl的属性。然后,我与Jason的不同之处在于,我不建议使用字典,而是建议使用列表,然后可以依次将其序列化为JSON(使用DataContractJsonSerializer),并将JSON作为动态脚本发出,而不是手动生成使用字符串buider的javascript。

为什么要清单?我认为我们可能会发现,字典至少在使用DataContractJsonSerializer序列化为json时才有效(仅在3.5框架,2.0或者3.0框架中才可用,我们需要在aspnet ajax上使用螺栓并使用json序列化器)。列表的序列化工作起来比较麻烦。虽然那是主观的。

客户端代码也有影响。现在在客户端,我们将获得一个数组的json序列化MyImageResourceClass实例。我们需要在创建时遍历此数组,以创建" img"标签。

希望这些想法和建议可以前进!毫无疑问,还有其他解决方案。我很想看看这是怎么回事。