Подтвердить что ты не робот

Получение Абсолютного URL-адреса для ASP.NET MVC Action

Это, вероятно, фиктивный вопрос, но я не могу найти четкое указание. У меня есть класс POCO в веб-приложении MVC3, единственной целью которого является управление резервным копированием некоторых файлов на сервере. Обычно он создает резервную копию и возвращает имя файла контроллеру, который отправляет электронное письмо с 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. Любая идея?

4b9b3361

Ответ 1

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

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/

Извлечен из Meligys AngularJS и Web Dev Goodies Newsletter

Ответ 2

Внутри контроллера:

var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri

Ответ 3

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

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

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

Ответ 5

Я написал для этого класс-помощник, для 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;
    }
}

Ответ 6

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

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