从ASP.NET MVC操作获取绝对URL
这可能是一个虚拟的问题,但我找不到一个明确的指示。 我在MVC3 Web应用程序中有一个POCO类,其唯一目的是pipe理服务器中某些文件的备份。 通常它会创build一个备份并将文件名返回给控制器,该控制器会发送一封包含用于下载的URL的电子邮件。 这工作正常,但我不能build立绝对的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 。 任何想法?
你可以这样做:
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.Content()
或任何路由方法,而不是使用Url.Content()
,或者只是传递一个path。
但是,如果URL确实发送到Controller
Action
,则会有一种更紧凑的方式:
var contactUsUriString = Url.Action("Contact-Us", "About", routeValues: null /* specify if needed */, protocol: Request.Url.Scheme /* This is the trick */);
这里的技巧是,一旦你在调用任何路由方法时指定protocol
/scheme,就会得到一个绝对的URL。 我build议尽可能使用这个 ,但在第一个例子中,如果您需要的话,也可以使用更通用的方法。
我在这里详细地写了一篇文章:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
从Meligy的AngularJS和Web Dev Goodies Newsletter中提取
从控制器内部:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco); var url = new Uri(Request.Url, path).AbsoluteUri
这适用于我:
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中的用法:
@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
如果host
或protocol
参数非空,MVC 4中的内置帮助程序将创build绝对URL。 在这里看到这个答案 ,在视图中使用示例扩展方法。
我为此编写了一个辅助类,用于MVC 5 …这非常灵活,如果您不在控制器内部时需要此function,则该类非常有用。 你应该能够把它放到一个项目中去。
正如Meligy指出的那样,关键是要包括协议。 在这里,我把它硬编码为http,所以如果你想使用SSL,可能需要变得更灵活一些。
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; } }
你有几个select:
- 将HttpContext.Request.Url的值保存在静态或成员variables中,并使用它来传递完全限定的path。
- 将应用程序域保存在web.config中的应用程序设置中。
- 硬编码的价值。