【问题标题】:ASP.NET WebForms: Why do relative paths within user controls work locally, but not when deployed?ASP.NET WebForms:为什么用户控件中的相对路径在本地工作,但在部署时却不行?
【发布时间】:2012-08-08 14:35:16
【问题描述】:

重写问题

在我的一生中,我无法让相对图像路径在使用 VS 的开发服务器和发布到远程 IIS 服务器之间的用户控件中始终如一地工作。我不想通过添加runat="server" 使我的图像成为服务器标签。我希望它是严格的客户端,我不想使用任何 hocus pocus 代码黑客。我想解决断开连接,所以这是我的问题:

我的图像存储在~/images。 我的用户控件存储在~/usercontrols/anothersubfolder

当我这样做时......

<img id="myimage" src="../../Images/help.png" alt="" />

...图像在使用 VS 开发服务器 (localhost) 时加载,但在我部署到远程 IIS 虚拟目录时加载。但是,当我这样做时......

<img id="myimage" src="<%=Request.ApplicationPath %>/Images/help.png" alt="" />

...当我远程发布但不使用开发服务器时它可以工作!

我需要一个适用于 VS 开发服务器和远程发布的解决方案。正如我所说,我不想将runat="server" 添加到我的图像标签或使用任何代码黑客。这里有一个断开连接,我想知道如何解决这个问题。

【问题讨论】:

标签: asp.net user-controls relative-path


【解决方案1】:

【讨论】:

  • 正如我的问题所述,我已经知道服务器端控件将生成正确的相对路径(请参阅我如何使用 ASP Image 控件)。只是我不想为此使用服务器控件。
  • 您不需要使用服务器控件。通过添加 runat 属性,HTML 控件将在服务器端正确解析。
  • 但是如果有runat="server",它不会占用ViewState中的空间吗?
  • 不,图片会被浏览器缓存。 ViewState 将是最小的,如果有的话。
  • @IrishChieftain:但没有 runat="server" 就不行!?
【解决方案2】:

您似乎找到了自己的答案:ascx 控件的位置不会改变相对路径。加载 ascx 控件的 aspx 页面最终确定了路径(这将扩展到您的 CSS 和 JS 文件,如果您正在使用任何文件)。

我通过从不使用相对路径来“解决”了这个问题。我的src 属性总是看起来像<img src="/<appfolder>/Images/<filename>.<extension> />

值得注意的是,我更改了我的网站属性,并在属性页的 Web 选项卡下选择了使用本地 IIS Web 服务器。由于我不使用 Visual Studio 开发服务器,因此您的里程可能会根据您的项目配置而有所不同。

【讨论】:

  • 哇...到目前为止,这适用于发布到服务器并使用 VS 2010 的开发服务器在本地进行调试。起初,我认为在路径前面加上/ 只是为了转到父文件夹,但那是../。我现在将你的答案标记为答案,并在我对此进行更多测试后奖励赏金。
  • 我不得不取消标记,因为这根本不起作用。要求模组将赏金延长一周,因为我要去度假,直到下周才有时间测试。
  • 这不起作用的原因是,如果我的站点位于www.mycompany.com/mywebapp,我必须将/mywebapp 附加到URL,因为/ 解析为www.mycompany.com。如果网站在不同的虚拟目录中有多个版本(例如/mywebappdev/mywebappbusinesstesting),就会出现问题。
  • 我明白你的意思,但是在同一台服务器上拥有同一个站点的多个版本是一种真的不好的做法。在任何情况下都不要这样做。如果您没有测试服务器,请在您的开发机器上进行设置。永远不要将网站的测试版本部署到生产环境。
  • 其次,如果您真正在测试您的网站,您的资源也会发生变化(不同的图像大小、徽标重新设计、屏幕截图更新等),并且您的代码必须更改以适应这种情况.您应该始终将您的资源部署到与其所在的目录一致(或设置 CDN)以避免权限问题。
【解决方案3】:

正如其他人已经回答的那样,包含它的页面正在加载用户控件“.ascx”,顺便说一句,它与母版页相同 - 它们正在由页面加载。 因此,您在脚本中描述的任何相对路径都是相对于页面位置的。

所以把<img id="myimage" src="~/Images/help.png" alt="" runat="server" />或者简单地使用服务器端控制图像,将在技术上解决你的问题..

但据我了解,您的问题不像您可能知道的那样技术性强..
所以剩下的假设是,关于将简单的 html 控件变形为您所描述的“代码破解”,您的问题更具概念性。

您必须掌握有关使用 asp.net 的“标准”,
要做到这一点,您首先需要了解 asp.net 是一个旨在在服务器端生成页面然后将这个新创建的动态生成页面传递到客户端的系统 - 这是主要的使用 asp.net 的好处,是它的最高原则!
这就是为什么您在 asp.net 中的页面不是 .html - 它是 .aspx,即使稍后生成的脚本只是 html。

因此,如果您同意我前面的段落,您也了解您创建的任何 .aspx 页面在交付之前都由您的服务器处理,并且您放入其中的脚本标签只是关于如何动态处理它的一组说明.添加runat="server" 仅表示脚本标签的属性和内容在生成的html页面的生成过程中需要服务器端特别注意。

您在 VS 中的 aspx 页面和为您的浏览器生成的 aspx 页面不是同一个实体。
runat="server" 永远不会出现在交付给客户端的脚本中。

在 asp.net 中编写脚本不是编写 html - 它是编写元指令,旨在影响生成的 html 将包含的内容。

我希望到目前为止,我已说服您将提供的最佳技术解决方案用作 asp.net 中的正常和自然标准,而不会感到悲伤或遗憾。

【讨论】:

    【解决方案4】:
    <img id="myimage" src='<%= ResolveUrl("~/src/....") %>'/>
    

    【讨论】:

      【解决方案5】:

      当您在本地运行它时,您使用的是您创建的文件夹,并且您正在使用它,发布后您的控件可能最终位于由 VS 创建的控件文件夹中,并且您原来的包含 2 个文件夹的文件结构消失了。发布后检查文件系统并重新排序您的工作文件夹。

      【讨论】:

      • 文件夹结构相同。正如我在问题更新中指出的那样,我认为它正在尝试使用相对于它正在呈现的页面的路径,而不是控件的实际位置。
      • 我检查了我所有的旧控件,我不得不承认我一直使用服务器控件!猜猜你必须坚持使用
      【解决方案6】:

      用户控件中的相对路径是相对于它们出现的页面,而不是用户控件的位置。这基本上就是你在更新中所说的,我相信。

      您应该将您的更新发布为答案并接受它,或者接受我的回答,以您的偏好为准:)

      【讨论】:

        【解决方案7】:

        就像另一种可能性一样,默认情况下 IIS 上禁用了 ASP 父路径,这可能是您的问题的原因吗?

        This 文章讨论了如果是这样的问题如何解决。基本上,您可以通过多种方式解决它,但最简单的方法是进入 IIS 站点上的 ASP 设置并重新启用父路径。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-15
          • 2021-02-20
          • 2018-03-30
          • 2013-12-21
          • 2016-03-21
          • 2015-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多