【发布时间】:2010-01-12 19:01:44
【问题描述】:
我有一个问题,我在自定义 HtmlHelper 中为我的 MVC 应用程序生成链接,而 RouteLink 不知道 MVC 应用程序有一个虚拟目录。这意味着我可以在测试中很好地调试和使用该应用程序,但它会在生产中生成无效链接。有没有办法让 RouteLink() 或 ActionLink() 在生成链接时包含已部署应用程序的虚拟目录?
下面是相关代码sn-p:
private const string STagLink = "<span class=\"tag-{0}\">{1}</span>\r\n";
...
MvcHtmlString link = html.RouteLink(x.Name,
new { Tag = x.Name, Controller = x.Controller, Action = x.Action },
new { @class = "tag", Title = x.Title });
sb.AppendFormat(STagLink, j, link.toHtmlString());
这会为开发实例生成一个类似“/Home/Tag/Production”的链接,但是当应用程序部署到像 /foo 这样的虚拟目录时,该链接仍然是“/Home/Tag/Production”而不是“/foo/Home/Tag/Production”。
Phil Haack 博客上的讨论类似:http://haacked.com/archive/2009/01/30/aspnetmvc-refresh.aspx#71053
是在开发时为 MVC 应用程序设置虚拟路径的唯一解决方案吗?我希望 MVC 能够知道它运行的上下文。
【问题讨论】:
-
ActionLink和RouteLink当然知道虚拟文件夹。我们每天都在生产中利用这一点。这里缺少一些东西。 -
感谢克雷格的回复。我也有同样的想法,这就是为什么我现在很困惑为什么我的 URL 不包含虚拟文件夹。
-
FWIW,我正在使用 link.toHtmlString() 来获取链接文本。我应该使用其他方法吗?
-
另外,我现在正在测试的机器也是装有 Visual Studio 的机器。我为“安装” MVC 应用程序所做的只是在该机器的 IIS 网站上为其创建一个虚拟目录。
-
ToHtmlString应该没问题。您只需要在 IIS 中创建虚拟文件夹即可。请注意,虚拟文件夹意味着您必须每次都使用Url.Content、Html.RouteLink等。硬编码的绝对URI将失败。
标签: asp.net-mvc asp.net-mvc-routing