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

3

在我的Web应用程序中,我将所有JavaScript文件作为嵌入式资源包含在程序集中,并使用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}';
3个回答

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

希望这可以帮到你。

3
我不是特别关心@Jon建议的确切实现方式,但其背后的思想是正确的,我同意发出这些内容是一个好主意。
稍微更好的实现方式(虽然这在某种程度上是主观的)是创建一个服务器端模型(即:C#类),该模型表示此字典(或仅使用Dictionary<string,string>的实例),并将其序列化为JavaScript文字对象符号。这样,您就不必处理Jon示例中看到的字符串操作(如果这使您感到困扰)。

2
我同意Jason对我最初提出的解决方案的评估,它确实可以改进。我的解决方案代表了旧版javascript思维方式(即在ajax和JSON出现之前)。总是有更好的方法来解决问题,这也是StackOverflow如此酷的原因之一。我们共同更擅长编程手艺,而不是单独一个人。

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

为什么要用列表?我认为你可能会发现,将字典序列化为JSON时,至少使用(仅适用于3.5框架,在2.0或3.0框架上,您需要添加aspnet ajax并使用其JSON序列化器),比如列表更难处理。虽然这是主观的。

还有客户端代码的影响。现在,在客户端,您将拥有一个JSON序列化的MyImageResourceClass实例数组。您需要通过迭代此数组来创建您的标记。

希望这些想法和建议能帮助您入手!毫无疑问,还有其他解决方案。我很想看到这个项目的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接