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

时间:2008-09-05 18:31:39

标签: c# asp.net javascript

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

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 个答案:

答案 0 :(得分:3)

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

希望这有帮助。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

我同意Jason对我提出的初始解决方案的评估,它肯定可以改进。我的解决方案代表了一种较旧的学校javascript心态(阅读,出现ajax和json)。总有更好的方法来解决问题,这也是stackoverflow如此酷的原因之一。总的来说,我们在编程技巧方面比我们自己更好。

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

为什么要列表?我想你可能会发现序列化为json时的字典,至少使用DataContractJsonSerializer(只有3.5框架提供的fyi,使用2.0或3.0框架,你需要在aspnet ajax上使用并使用json serializer),与列表序列化的方式相比,使用起来更麻烦一些。虽然这是主观的。

您的客户端代码也会产生影响。现在在客户端,你将拥有一个json序列化MyImageResourceClass实例的数组。您需要遍历此数组,随时创建“img”标记。

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