如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径

Posted

技术标签:

【中文标题】如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径【英文标题】:How to specify virtual path for image in ASP.Net MVC razor helper 【发布时间】:2012-04-09 12:41:41 【问题描述】:

在我的 razor style helper 类(位于 App_Code 文件夹中,我有这行代码:

<img src="../../Content/images/ajax_activity.gif" />

这在 Cassini 中运行良好,但是当我将应用程序部署到 IIS(虚拟目录)时,IIS 找不到路径。虚拟路径被忽略。 这也不起作用:

<img src="@Href("~/Content/images/ajax_activity.gif")"  />

【问题讨论】:

This also doesn't work ... 为什么不呢?请向我们展示生成的 html 嗨 SLaks。由于这是 jQuery 对话框中的 ajax 调用,因此无法(至少我不知道)查看生成的源代码,但在 Firebug 中查看它,我收到以下错误消息:“NetworkError: 404 Not找到 - localhost/Content/images/ajax_activity.gif"。我已经将虚拟目录设置为 Merkur,所以真实路径应该是localhost/Merkur/Content/images/ajax_activity.gif。 还有一件事。当从视图中调用时,上面的两个示例都可以正常工作。问题似乎与帮助程序位于 App_Code 目录中有关(需要它们在那里,因为我从多个视图中调用它们)。 太好了,它就在那里,它返回以下内容: 【参考方案1】:

我知道这是一篇旧帖子,但我需要的信息在这里。

对我来说,缺少的部分是“发布时”。因此,对于任何寻找如何使用 Web 配置转换的未来开发人员,我遵循的过程是:

    为每个项目配置(即部署)添加一个转换文件

    添加环境特定元素(不要忘记 xdt 属性)

    为您的本地开发修改 Web.config。

项目一发布,就会发生转化。

【讨论】:

【参考方案2】:

您可以使用@Url.Content 方法将虚拟相对路径转换为绝对应用程序路径,如下所示:

<img src=@Url.Content("~/images/picture.png") >

它会转换成这个HTML代码转发给客户端:

<img src="/appname/images/picture.png" >

更新: 另一方面,您可以将图像转换为 base64,它也会正确显示:

<img src="data:image/png;base64,iVBORw0KG...SuQmCC" >

【讨论】:

【参考方案3】:

当您在 IIS 的虚拟目录中部署时,应用根目录可能与您在开发环境中的不同。

如果您的应用网址类似于

http://localhost/MyWebApp/

ASP.NET 会认为根是“localhost”,而它应该是“MyWebApp”。

要解决这个问题,您必须将虚拟目录转换为应用程序:在 IIS 管理器中,找到您的目录,右键单击它,然后“转换为应用程序”。

【讨论】:

【参考方案4】:

好的,解决了,但我不确定它为什么会起作用。在尝试了以下所有组合均未成功后:

<img src="../Content/images/ajax_activity.gif" />
<img src="/Content/images/ajax_activity.gif" />
<img src="~/Content/images/ajax_activity.gif" />
<img src="Content/images/ajax_activity.gif" />

以下终于按预期工作了

<img src="./Content/images/ajax_activity.gif" />

它正确返回了带有虚拟目录集的图像路径。谁能解释一下?

【讨论】:

延迟回复,但./Stuff/foo.bar 将在应用程序的基本目录中查找Stuff/foo.bar~/Stuff/foo.bar 对应于您可能未配置的虚拟路径。 ../Stuff/foo.bar 是在父目录中查找 Stuff/foo.bar 的相对路径。 Stuff/foo.bar 查看当前目录,/Stuff/foo.bar.. 好吧,我无法解释那个。我本来希望那个人也可以查看基本目录。在尝试修复类似的解决方案时偶然发现了这一点。关键是这些都可能不同,这就是它可能不起作用的原因。 Stuff/foo.bar 不会是当前目录中的“Stuff 子目录”吗? 是的,抱歉,我的意思是Stuff/foo.bar 会在当前目录中查找Stuff/foo.bar【参考方案5】:

试试这个:

<img src="@Url.Content("~/Content/images/ajax_activity.gif")"  />

【讨论】:

这会导致以下编译器错误:CS0103: The name 'Url' does not exist in the current context 这对我有用。可能更适用于更广泛的环境。

以上是关于如何在 ASP.Net MVC 剃须刀助手中指定图像的虚拟路径的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 3 剃须刀。导航以查看表格 tr 点击

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?

在 asp .net mvc 5 中预编译剃须刀视图

ASP.Net MVC3 - 将剃刀标记作为参数传递

混合 SPA 和 ASP.NET MVC 路由

您将如何在 asp.net mvc 中实现面包屑助手?