Getting Absolute URL fron an ASP.NET MVC Action
这可能是一个虚伪的问题,但我找不到明确的迹象。我在MVC3 Web应用程序中有一个POCO类,它的唯一目的是管理服务器中某些文件的备份。通常,它会创建一个备份并将文件名返回给控制器,控制器会发送一封电子邮件,其中包含下载文件的URL。这很好,但我无法构建要发送的绝对URL。无论使用哪种功能,我都会得到一个相对的URL,比如/backup/thefile.zip,而不是http://www.somesite.com/backup/thefile.zip。我试过:
1 2 3 | VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip"); HttpRuntime.AppDomainAppVirtualPath +"/Backup/SomeFile.zip"; Url.Content("~/Backup/SomeFile.zip"); |
但它们都返回类似/backup/somefile.zip的内容。有什么想法吗?
您可以通过以下方式完成:
1 2 3 4 5 6 7 8 9 10 | var urlBuilder = new System.UriBuilder(Request.Url.AbsoluteUri) { Path = Url.Action("Action","Controller"), Query = null, }; Uri uri = urlBuilder.Uri; string url = urlBuilder.ToString(); // or urlBuilder.Uri.ToString() |
在这个示例中,您也可以使用
但是,如果该URL指向
1 2 3 4 | var contactUsUriString = Url.Action("Contact-Us","About", routeValues: null /* specify if needed */, protocol: Request.Url.Scheme /* This is the trick */); |
这里的技巧是,一旦在调用任何路由方法时指定
我在博客中详细介绍了这一点:http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
Extracted from Meligy’s AngularJS & Web Dev Goodies Newsletter
从控制器内部:
1 2 | var path = VirtualPathUtility.ToAbsolute(pathFromPoco); var url = new Uri(Request.Url, path).AbsoluteUri |
这对我很有用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using System; using System.Web; using System.Web.Mvc; public static class UrlExtensions { public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false) { var path = urlHelper.Content(contentPath); var url = new Uri(HttpContext.Current.Request.Url, path); return toAbsolute ? url.AbsoluteUri : path; } } |
CSHTML中的用法:
1 | @Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true) |
如果
在ASP.NET核心2.0(MVC)中,这用于创建操作的绝对URL。
1 |
我为此编写了一个助手类,用于MVC 5…它非常灵活,如果您不在控制器内时需要此功能,它尤其有用。你应该能够把它直接放到一个项目中去。
正如梅利吉指出的,关键是要包括协议。这里我将它硬编码为HTTP,所以如果您想使用SSL,可能需要变得更加灵活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class AbsoluteUrlHelper { /// <summary> /// Creates an absolute"fully qualified" url from an action, and assumes the current controller. /// </summary> /// <returns></returns> public static string GetAbsoluteUrl(string action, object routeValues = null) { var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); var values = urlHelper.RequestContext.RouteData.Values; var controller = values["controller"].ToString(); return GetAbsoluteUrl(action, controller, urlHelper, routeValues); } /// <summary> /// Creates an absolute"fully qualified" url from an action and controller. /// </summary> public static string GetAbsoluteUrl(string action, string controller, object routeValues = null) { var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); return GetAbsoluteUrl(action, controller, urlHelper, routeValues); } /// <summary> /// Creates an absolute"fully qualified" url from an action and controller. /// </summary> public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null) { var uri = urlHelper.Action(action, controller, routeValues,"http"); return uri; } } |
您有几个选择:
- 在静态变量或成员变量中保存httpcontext.request.url的值,并使用该值传递完全限定的路径。
- 将应用程序域保存在web.config中的应用程序设置中。
- 硬编码该值。