从C#中的其他资源引用嵌入式资源
在我的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"标签。
希望这些想法和建议可以前进!毫无疑问,还有其他解决方案。我很想看看这是怎么回事。