2

重写问题

在我的一生中,我无法让相对图像路径在使用 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"到我的图像标签或使用任何代码黑客。这里有一个断开连接,我想知道如何解决这个问题。

4

7 回答 7

4

试试这样:

<img src="~/Images/indicator.gif" border="0" alt="" runat="server" />

避免 ASP.NET 中的相对和绝对 URL 问题

Control.ResolveUrl 与 Control.ResolveClientUrl 与 VirtualPathUtility.ToAbsolute

ResolveUrl 与 ResolveClientUrl

于 2012-08-08T14:44:44.190 回答
1

正如其他人已经回答的那样,包含它的页面正在加载用户控件“.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 中的正常和自然标准,而不会感到悲伤或遗憾。

于 2013-08-12T11:27:35.830 回答
1

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

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

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

于 2012-08-08T20:21:00.597 回答
1
<img id="myimage" src='<%= ResolveUrl("~/src/....") %>'/>
于 2019-07-04T13:15:19.207 回答
0

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

于 2012-08-08T14:45:05.097 回答
0

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

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

于 2012-08-08T15:57:32.010 回答
0

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

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

于 2013-08-16T07:11:39.027 回答