我有一个ASP.NET MVC Web应用程序需要使用include指令包含其他几个html文件,如下所示:
<!--#include virtual=/include/bottom.shtml -->
我的问题是我需要在应用程序路径不同的服务器上部署此应用程序。例如,在一个地方我可能会将应用程序映射到localhost/myapp/
,而在另一个地方我可能只有localhost/
。
在localhost/
场景中,我上面给出的代码示例工作得很好。但是当我的应用程序在localhost/myapp
上时,我收到一条解析器错误消息,告诉我它无法找到该文件。
如何自定义指令以考虑应用程序的相对路径(最好不要每次都使用查找和替换)?
谢谢!
答案 0 :(得分:3)
杀死前导斜杠 - 强制路径从根目录计算,而不是你的页面。
但是像@mare所说,没有理由在2011年使用#include。你可能想做的是使用Razor的@Html.Partial()
将其渲染为部分。
鉴于更新的约束,在MVC中处理此问题仍然比使用旧的#include更清晰。您要做的是设置控制器操作以从磁盘读取文件并吐出内容。然后像普通的MVC动作一样渲染该动作。
答案 1 :(得分:1)
首先,我不知道为什么你会在ASP.NET MVC中使用这样的指令,因为还有其他更好的选项,如Partials,Sections等。
但是,如果您确实想要使用这些指令,则可以使用
获取相对路径Url
帮手。
<强>更新强>
使用Url.Content(),Url.Action(),Url.ActionLink()等Url
个助手方法构建ASP.NET MVC中的链接。
例如,这将在典型的ASP.NET MVC Razor视图中呈现bottom.shtml文件的相对路径:
#include virtual=@Url.Content("~/include/bottom.shtml")
现在你的问题源于使用显然在HTML评论中的include
。
我只能解释我的观察。如果我在我的视图中执行此操作
<!-- @Url.Content("~/public/images/foobar.png") -->
这适用于ASP.NET MVC WebForms视图引擎
<!-- <%=Url.Content("~/public/images/foobar.png")%> -->
我通过以前的句子在网页的源代码中通过浏览器呈现这个:
<!-- /public/images/foobar.png -->
因此,我相信它正在运行,但我也认为您可能需要更多的ASP.NET MVC学习。