2008-09-05 119 views
3

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

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}'; 

回答

3

我建议你发出网络资源的动态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']; 

希望这有助于。

3

我并不特别在意@Jon的确切实现,但其背后的想法很有道理,我同意发布这些将是一件好事。

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

2

我同意Jason对我提出的初始解决方案的评估,它肯定可以改进。我的解决方案代表了一个较老的学校javascript思路(阅读,预先出现ajax和json)。总是有更好的方法来解决问题,这是为什么stackoverflow非常酷的原因之一。总的来说,我们比自己的任何人都更擅长编程技术。

根据Jason的想法,我会修改我的初始代码,并修改Jason建议的一些内容。使用两个属性实现一个C#类,即img资源“id”和一个包含WebResourceUrl的属性。然后,我与Jason的不同之处在于,不是使用字典,而是使用List,然后您可以依次序列化为JSON(使用DataContractJsonSerializer),并发出JSON作为动态脚本,而不是手动生成使用字符串buider的JavaScript。

为什么列表?我认为你可能会发现字典序列化为json时,至少使用DataContractJsonSerializer(仅适用于3.5框架,需要2.0或3.0框架才能在aspnet ajax上使用并使用json序列化程序),都是与列表如何序列化相比,使用起来更麻烦。虽然这是主观的。

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

希望这些想法和建议可以帮助你开始!毫无疑问,还有其他解决方案。我很想看看这是什么。