Возвращение базового пути / URL-адреса C # MVC5 в контроллере и представлении [дубликат]

Для тех, кто все еще ищет ответ, я решил это с помощью Angular 5 и HttpClient:

const formData = new FormData();

// append your data
formData.append('myKey1', 'some value 1');
formData.append('myKey1', 'some value 2');
formData.append('myKey3', true);

this.httpClient.post('apiPath', formData);

НЕ устанавливайте заголовок Content-Type, угловые исправят это для вас!

249
задан Benjamin Pollack 17 August 2009 в 14:47
поделиться

20 ответов

Предполагая, что у вас есть объект Request, вы можете использовать:

string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));

Если он недоступен, вы можете перейти к нему через контекст:

var request = HttpContext.Current.Request
339
ответ дан Suhas 24 August 2018 в 22:00
поделиться
  • 1
    Что urlHelper.Content("~")? Как создать define urlHelper? Благодаря! – Maxim Zaslavsky 15 August 2010 в 08:38
  • 2
    @Maxim, вы можете, вероятно, заменить Url.Content (& quot; ~ & quot;) – UpTheCreek 24 November 2010 в 16:14
  • 3
    В результате я использовал: var request = HttpContext.Current.Request; urlBase = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, (new System.Web.Mvc.UrlHelper(request.RequestContext)).Content("~")); – Peter 28 November 2011 в 12:21
  • 4
    Url.Content («~») сделал трюк здесь. – programad 19 January 2012 в 15:04
  • 5
    Для MVC 4 я использую ControllerContext.RequestContext.HttpContext.Request – row1 12 October 2012 в 03:10

У вас может быть статический метод, который смотрит на HttpContext.Current и определяет, какой URL использовать (развитие или живой сервер) в зависимости от идентификатора хоста. HttpContext может предложить даже более простой способ сделать это, но это первый вариант, который я нашел, и он отлично работает.

2
ответ дан Adrian Grigore 24 August 2018 в 22:00
поделиться

Вы можете использовать следующий сценарий в поле зрения:

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>
2
ответ дан Andrus 24 August 2018 в 22:00
поделиться

Для абсолютного базового URL используйте это. Работает как с HTTP, так и с HTTPS.

new Uri(Request.Url, Url.Content("~"))
17
ответ дан arni 24 August 2018 в 22:00
поделиться

Возможно, это расширение или модификация ответов, размещенных здесь, но я использую просто следующую строку, и она работает:

Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")

Когда мой путь: http://host/iis_foldername/controller/action, я получаю: http://host/iis_foldername/

36
ответ дан Bronek 24 August 2018 в 22:00
поделиться

Я положил это в голову моего _Layout.cshtml

 <base href="~/" />
0
ответ дан cineam mispelt 24 August 2018 в 22:00
поделиться

Для ASP.NET MVC 4 это немного отличается:

string url = HttpContext.Request.Url.AbsoluteUri;
2
ответ дан Fernando Vezzali 24 August 2018 в 22:00
поделиться

На самой веб-странице:

<input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}",
  HttpContext.Current.Request.Url.Scheme,
  HttpContext.Current.Request.Url.Authority,
  Url.Content("~"))" />

В javascript:

function getReportFormGeneratorPath() {
  var formPath = $('#reportForm').attr('action');
  var newPath = $("#basePath").val() + formPath;
  return newPath;
}

Это работает для моего проекта MVC, надеюсь, что это поможет

1
ответ дан hemp 24 August 2018 в 22:00
поделиться
  • 1
    @hemp Отредактировано, но не голосовало за это? Надеюсь, что очки ценны для вас – Andrew Day 4 October 2017 в 13:17
  • 2
    Этот вопрос и связанные с ним ответы не помогли мне в моей конкретной проблеме, поэтому я не пробовал ни голосовать за кого-либо из них. Я отредактировал это, потому что мне довелось увидеть это и подумал, что это может быть достойный ответ, если он был отформатирован правильно. Просто пытаюсь быть хорошим гражданином. – hemp 8 October 2017 в 01:24
  • 3
    Кроме того, нет точек репутации, полученных для редактирования ответа. – hemp 6 January 2018 в 02:40

Для url с псевдонимом аппликации вроде http://example.com/appAlias/ ... Вы можете попробовать следующее:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);
1
ответ дан Jacek Gzel 24 August 2018 в 22:00
поделиться

В MVC _Layout.cshtml:

<base href="@Request.GetBaseUrl()" />

То, что мы используем!

public static class ExtensionMethods
{
public static string GetBaseUrl(this HttpRequestBase request)
        {
          if (request.Url == (Uri) null)
            return string.Empty;
          else
            return request.Url.Scheme + "://" + request.Url.Authority + VirtualPathUtility.ToAbsolute("~/");
        }
}
11
ответ дан katibaer 24 August 2018 в 22:00
поделиться
  • 1
    А Ури? эм ... – Paul Zahra 12 September 2014 в 13:00
  • 2
    +1 для использования <base>. Также вы можете опустить схему таким образом, чтобы она работала с http или https. Это означает, что вы можете запустить url с помощью //. – Jess 9 December 2016 в 20:01

Возможно, это лучшее решение.

@{
   var baseUrl = @Request.Host("/");
}

с использованием

<a href="@baseUrl" class="link"Base URL</a>
1
ответ дан msavara 24 August 2018 в 22:00
поделиться
  • 1
    Я не тестировал, но я сомневаюсь, что это сработает, когда базовый url будет виртуальным напрямую. то есть. локальный / MYAPP – emragins 16 December 2015 в 05:46

Это работает в ASP.NET MVC 4 В любом действии контроллера вы можете написать: 1stline получает весь url + Query String. 2-я строка удаляет локальный путь и amp; запрос, последний символ '/'. Третья строка добавляет символ «/» в последнюю позицию.

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );
2
ответ дан Muhammad Ashikuzzaman 24 August 2018 в 22:00
поделиться

В коде:

Url.Content("~/");

MVC3 Razor Синтаксис:

@Url.Content("~/")
54
ответ дан mxasim 24 August 2018 в 22:00
поделиться
  • 1
    Это хорошо для использования на страницах Razor, но если вы пытаетесь передать URL-адрес внешнему источнику, он не даст вам полного URL-адреса. – krillgar 3 April 2014 в 15:03
  • 2
    Это не работает. Он просто добавит / вместо фактического имени. – Mrchief 21 April 2016 в 02:15
  • 3
    Где код имеет доступный вам помощник Url сразу с места в карьер? Может быть, только в Controller. Конечно, не в ViewModel или в любом другом class, где вам может понадобиться это. – Serj Sagan 12 August 2016 в 23:31

Следующий фрагмент работает для меня в MVC4 и не нуждается в HttpContext:

System.Web.HttpRuntime.AppDomainAppVirtualPath
22
ответ дан p.campbell 24 August 2018 в 22:00
поделиться
  • 1
    Кажется, тоже работает в MVC3. Я использую его в jQuery.load() для создания URL-адреса контроллера и действия, которое я хочу вызвать: $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...); – Kjell Rilbe 19 October 2012 в 10:17
  • 2
    Почему ты бы так поступил? вместо вызова Url.Action? – BlackTigerX 10 July 2014 в 23:05
  • 3
    Не работает при развертывании в Azure. В этом сценарии работают более высокие номинальные ответы. – Jeff Dunlop 18 May 2015 в 08:51

Это преобразование свойства asp.net в MVC .

Объявить вспомогательный класс:

namespace MyTestProject.Helpers
{
    using System.Web;

    public static class PathHelper
    {
        public static string FullyQualifiedApplicationPath(HttpRequestBase httpRequestBase)
        {
            string appPath = string.Empty;

            if (httpRequestBase != null)
            {
                //Formatting the fully qualified website url/name
                appPath = string.Format("{0}://{1}{2}{3}",
                            httpRequestBase.Url.Scheme,
                            httpRequestBase.Url.Host,
                            httpRequestBase.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Url.Port,
                            httpRequestBase.ApplicationPath);
            }

            if (!appPath.EndsWith("/"))
            {
                appPath += "/";
            }

            return appPath;
        }
    }
}

Использование:

Использовать с контроллера:

PathHelper.FullyQualifiedApplicationPath(ControllerContext.RequestContext.HttpContext.Request)

Использовать в представлении:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)
14
ответ дан Paul Zahra 24 August 2018 в 22:00
поделиться
  • 1
    Это единственный ответ, который объясняет возможность работы сайта на порту, отличном от 80. Все остальные ответы являются небезопасными, насколько мне известно. Благодаря! – jebar8 7 January 2015 в 23:25

Для MVC 4:

String.Format("{0}://{1}{2}", Url.Request.RequestUri.Scheme, Url.Request.RequestUri.Authority, ControllerContext.Configuration.VirtualPathRoot);
1
ответ дан r.pankevicius 24 August 2018 в 22:00
поделиться

в простых html и ASP.NET или ASP.NET MVC, если вы используете тег:

<a href="~/#about">About us</a>
2
ответ дан Ravi Anand 24 August 2018 в 22:00
поделиться

Поэтому ни один из перечисленных здесь не работал для меня, но, используя несколько ответов, я получил что-то:

public string GetBaseUrl()
{
    var request = HttpContext.Current.Request;
    var appUrl = HttpRuntime.AppDomainAppVirtualPath;

    if (appUrl != "/") 
        appUrl = "/" + appUrl;

    var baseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, appUrl);

    return baseUrl;
}

Обновление для ASP.NET Core / MVC 6:

ASP.NET Core делает этот процесс немного более болезненным, особенно если вы глубоко в своем коде. У вас есть 2 варианта доступа к HttpContext

1) Передайте его с вашего controller:

var model = new MyClass(HttpContext);

, затем в model:

private HttpContext currentContext;

public MyClass(HttpContext currentContext)
{
    this.currentContext = currentContext;
}

2) Возможно, более чистый способ заключается в том, чтобы вводить его в ваш класс, который начинается с регистрации типов в вашем Startup:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddTransient<MyClass, MyClass>();
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

, после чего он вводится для вас следующим образом:

private HttpContext currentContext;

public MyClass(IHttpContextAccessor httpContextAccessor)
{
    currentContext = httpContextAccessor.HttpContext;
}

в любом случае, здесь обновлено для .NET Core GetBaseUrl():

public string GetBaseUrl()
{
    var request = currentContext.Request;

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

    return $"{request.Scheme}://{host}{pathBase}";
}
85
ответ дан Serj Sagan 24 August 2018 в 22:00
поделиться
  • 1
    Где вы положили этот метод? – Josh Dean 28 May 2013 в 01:05
  • 2
    Это действительно зависит от того, как часто вам нужно его использовать ... если это одноразовая сделка, то просто поместите ее в класс, где вам нужны эти данные, если вы ожидаете использовать его в нескольких классах в своем приложении, то я использую папку под названием Helpers в базе моего приложения, у меня есть класс static, называемый Statics, и я помещаю функции, подобные выше ... просто убедитесь, что вы изменили приведенное выше с public string GetBaseUrl() до public static string GetBaseUrl() – Serj Sagan 28 May 2013 в 18:02
  • 3
    В качестве обновления я больше не использую класс с именем Statics, вместо этого я его разломал на более конкретные виды использования, поэтому в этом случае это пойдет в мой класс UrlHelper – Serj Sagan 14 August 2016 в 22:29
  • 4
    повысить приоритет для решения .net core – Милан 21 March 2017 в 20:11
  • 5
    Host.ToUriComponent(), наконец, и мне удалось получить объект запроса с Url.ActionContext.HttpContext – mkb 10 March 2018 в 22:26

Это отлично работает для меня (также с балансировкой нагрузки):

@{
    var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
    var baseurl = urlHelper.Content(“~”);
}

<script>
    var base_url = "@baseurl";
</script>

Особенно, если вы используете нестандартные номера портов, используя Request.Url.Authority, похоже, , но сбой в среде LB.

4
ответ дан Tadej Gregorcic 24 August 2018 в 22:00
поделиться

Трюк с использованием IIS заключается в том, что привязки IIS могут отличаться от ваших общедоступных URL-адресов (WCF, которые я смотрю на вас), особенно с многопользовательскими машинами. Я склонен привязывать вектор к использованию конфигурации для явного определения «базового» URL-адреса для внешних целей, поскольку это имеет тенденцию быть немного более успешным, чем извлечение его из объекта Request.

24
ответ дан Wyatt Barnett 24 August 2018 в 22:00
поделиться
  • 1
    кажется разумным и менее подверженным ошибкам конфигурации. – Anonymous Type 14 February 2011 в 00:38
  • 2
    Также верно для серверов за балансирами нагрузки или прокси. – Ishmaeel 6 May 2014 в 14:45
Другие вопросы по тегам:

Похожие вопросы: