这可能是一个虚拟问题,但我找不到明确的指示 . 我在MVC3 Web应用程序中有一个POCO类,其唯一目的是管理服务器中某些文件的备份 . 通常,它会创建一个备份并将文件名返回给控制器,控制器会发送一封电子邮件,其中包含用于下载它的URL . 这工作正常,但我无法构建要发送的绝对URL . 无论我使用哪种功能,我总是得到一个相对的URL,比如/Backup/TheFile.zip,而不是像http://www.somesite.com/Backup/TheFile.zip . 我试过了:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");
但它们都返回类似/Backup/SomeFile.zip的东西 . 任何的想法?
7 回答
您可以通过以下方式完成此操作:
您可以使用
Url.Content()
或任何路由方法,或者只是传递路径,而不是此示例中的Url.Action()
.但是,如果URL确实转到
Controller
Action
,则有一种更紧凑的方式:这里的技巧是,一旦在调用任何路由方法时指定
protocol
/ scheme,就会得到一个绝对URL . I recommend this one when possible ,但在第一个示例中您也有更通用的方式,以备不时之需 .我在这里详细介绍了它:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
从控制器内部:
这对我有用:
在cshtml中的用法:
如果
host
或protocol
参数非空,则MVC 4中的内置帮助程序会创建绝对URL . 请参阅this answer here,并在视图中使用示例扩展方法 .在ASP.Net Core 2.0(MVC)中,这可以创建一个动作的绝对URL .
我为此编写了一个帮助类,对于MVC 5 ......它非常灵活,如果你不在控制器内部需要这个功能,它特别有用 . 您应该能够将其直接放入项目并继续 .
正如Meligy指出的那样,关键是要包括协议 . 在这里,我将其硬编码为http,因此如果您想使用可能需要变得更灵活的SSL .
你有几个选择:
将HttpContext.Request.Url的值保存在静态或成员变量中,并使用它来传递完全限定路径 .
将应用程序域保存在web.config中的应用程序设置中 .
硬编码值 .