【问题标题】:Referencing Embedded resources from other resources in c#在 c# 中从其他资源中引用嵌入式资源
【发布时间】:2010-09-07 23:18:22
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net javascript


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        为什么是列表?我认为您可能会在序列化为 JSON 时找到字典,至少使用DataContractJsonSerializer(仅供参考,仅适用于 3.5 框架,使用 2.0 或 3.0 框架,您需要使用 aspnet ajax 并使用 JSON 序列化程序),使用起来比列表如何序列化要麻烦一些。虽然这是主观的。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-30
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 2013-11-25
          相关资源
          最近更新 更多