Получать абсолютный URL-адрес фрон Ан ASP.NET в MVC действий
Это, наверное, глупый вопрос, но я не могу найти четких указаний. У меня есть класс POCO в веб-приложении MVC3, единственной целью которого является управление резервным копированием некоторых файлов на сервере. Обычно он создает резервную копию и возвращает имя файла контроллеру, который отправляет электронное письмо с URL-адресом для его загрузки. Это прекрасно работает, но я не могу построить абсолютный URL для отправки. Независимо от того, какую функцию я использую, я всегда получаю относительный URL, например / Backup / TheFile.молнии, а не например http://www.somesite.com/Backup/TheFile.zip. я попробовал:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");
но все они возвращают что-то вроде / Backup / SomeFile.молнии. Есть идеи?
7 ответов:
вы можете сделать это следующим образом:
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.Action()
в этом примере, вы можете также использоватьUrl.Content()
, или любой метод маршрутизации, или просто пройти путь.но если 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. я рекомендую этот, когда это возможно, но и более общий способ в первом примере, Если вам это нужно.Я написал об этом в блоге в деталях here:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/извлеченные из Meligy это в AngularJS & веб-разработки лакомства бюллетень
внутри контроллера:
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)
встроенные помощники в MVC 4 создают абсолютные URL-адреса, Если либо
host
илиprotocol
параметры непустые. Смотрите ответ здесь С примером метода расширения для использования в представлениях.
In ASP.Net Core 2.0 (MVC) это работает для создания абсолютного url-адреса действия.
var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
Я написал вспомогательный класс для этого, для MVC 5... Он довольно гибкий и особенно полезен, если вам нужна эта функциональность, когда вы не находитесь внутри контроллера. Вы должны быть в состоянии бросить его прямо в проект и идти.
Как отметил Мелиги, ключ должен включать протокол. Здесь у меня он жестко закодирован как 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; } }