Получение абсолютного URL от действия ASP.NET MVC - PullRequest
67 голосов
/ 13 сентября 2011

Это, вероятно, глупый вопрос, но я не могу найти четкого указания.У меня есть класс POCO в веб-приложении MVC3, единственной целью которого является управление резервным копированием некоторых файлов на сервере.Обычно он создает резервную копию и возвращает имя файла контроллеру, который отправляет электронное письмо с URL-адресом для его загрузки.Это работает нормально, но я не могу построить абсолютный URL для отправки.Независимо от того, какую функцию я использую, я всегда получаю относительный URL-адрес, например / Backup / TheFile.zip , а не, например, http://www.somesite.com/Backup/TheFile.zip..1008 * но все они возвращают что-то вроде / Backup / SomeFile.zip .Есть идеи?

Ответы [ 7 ]

106 голосов
/ 23 марта 2012

Вы можете сделать это следующим образом:

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 / при вызове любого метода маршрутизации вы получаете абсолютный URL. Я рекомендую этот вариант, когда это возможно , но у вас также есть более общий способ в первом примере, если он вам нужен.

Я подробно об этом писал здесь:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Извлечено из Новостей от Meligy's AngularJS & Web Dev Goodies

35 голосов
/ 10 мая 2012

Из контроллера:

var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri
17 голосов
/ 01 июня 2014

Это работает для меня:

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)
4 голосов
/ 19 февраля 2013

Встроенные помощники в MVC 4 создают абсолютные URL-адреса, если параметры host или protocol не пусты.См. этот ответ здесь с примером метода расширения для использования в представлениях.

1 голос
/ 25 марта 2018

В ASP.Net Core 2.0 (MVC) это работает для создания абсолютного URL для действия.

var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
0 голосов
/ 08 июля 2015

Я написал для этого вспомогательный класс для 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;
    }
}
0 голосов
/ 13 сентября 2011

У вас есть несколько вариантов:

  • Сохраните значение HttpContext.Request.Url в статической переменной или переменной-члене и используйте его, чтобы передать полный путь.
  • Сохраните домен приложения в настройках приложения в файле web.config.
  • Жесткий код значения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...