Як отримати поточний URL для перегляду в ядрі asp.net 1.0


102

У попередніх версіях asp.net ми могли використовувати

@Request.Url.AbsoluteUri

Але, схоже, це змінилося. Як ми можемо це зробити в ядрі asp.net 1.0?


2
Подобається це? stackoverflow.com/questions/28120222 / ...
DavidG

6
@DavidG Здається, що тепер ви можете використовувати UriHelper.GetDisplayUrl (Re‌ квест)
Марк G

Відповіді:


121

Ви повинні отримати хост і шлях окремо.

 @Context.Request.Host@Context.Request.Path

14
Це не повідомить про правильний URL-адресу, якщо додаток сидить у віртуальному каталозі. Вам потрібно буде встановити значення Request.Path зі значенням Request.PathBase, якщо воно є. Це стосується і майже всіх інших відповідей на це питання.
Падіган

Що це @між двома струнами? ви могли б це пояснити?
Мохаммед Нурелдін

3
@MohammedNoureldin: це синтаксис перегляду бритви.
jack.pop

2
Для сторінок з бритвою мені довелося використовувати @HttpContextзамість @Context. Для часткових поглядів @Contextпрацює. Я забув використання?
Андріод

2
Існує простий спосіб в MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604 / ...
Dan

110

Вам потрібна схема, хост, шлях та queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

або використовуючи нову функцію C # 6 "Строкова інтерполяція"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

1
Як отримати фрагмент, скажімо test.com/abc#123 , як отримати фрагмент № 123 із запиту?
Рей

4
@fanray Ви не можете. Браузери не надсилають URI-фрагменти на сервер
tmg

Подумайте про використання UriBuilder для створення URL-адрес.
Ерік Філіпс

84

Ви можете використовувати метод розширення Request:

Request.GetDisplayUrl()

33
Це працює, якщо додати @using Microsoft.AspNetCore.Http.Extensionsпотім@Context.Request.GetDisplayUrl()
Serj Sagan

2
все ще отримують - Запит не існує в поточному контексті
SeanMC

1
Майте на увазі підсумок інтелігенції цієї функції Suitable only for display. This format should not be used in HTTP headers or other HTTP operations. На підставі цього я думаю, що рішення @ tmg є найкращим (можливо, обгорнуто вашим власним методом розширення).
Гордон Глас

16

Це, мабуть, завжди можливо в .net core 1.0 з Microsoft.AspNetCore.Http.Extensions, який додає розширення, HttpRequestщоб отримати повну URL-адресу; GetEncodedUrl .

наприклад, з виду бритви:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Починаючи з 2.0, також є відносний шлях та запит GetEncodedPathAndQuery .


15

Використовуйте властивість AbsoluteUri урі, з ядром .Net ви повинні створити Uri з такого запиту,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

наприклад, якщо URL-адреса запиту " http://www.contoso.com/catalog/shownew.htm?date=today ", це поверне той самий URL-адрес.


8
Такі речі змушують мене думати. Net Core є деяким кроком назад. Це краще, ніж Request.Url в Asp.Net якимось чином не можу собі уявити?
Soenhay

8

Ви можете розглянути можливість використання цього методу розширення (з Microsoft.AspNetCore.Http.Extensionsпростору імен:

@Context.Request.GetDisplayUrl()

Для деяких моїх проектів я віддаю перевагу більш гнучкому рішенню. Існує два способи розширення.

1) Перший метод створює Uriоб'єкт із даних вхідних запитів (з деякими варіантами через необов'язкові параметри). 2) Другий метод отримує Uriоб'єкт і повертається stringу наступному форматі (без останнього косого кута): Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

Використання:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

але де ти дістаєшся httpContext? З цим не збирається працювати Microsoft.AspNetCore.Http.HttpContext.Request
Том

7

Якщо ви також хочете отримати номер порту з запиту, вам потрібно буде отримати доступ до нього черезRequest.Host властивість для AspNet Core.

Request.HostВластивість не просто рядок , але, замість цього, об'єкт , який містить як домен хоста і номер порту. Якщо номер порту спеціально виписав в URL (тобто "https://example.com:8080/path/to/resource"), то виклик Request.Hostдасть вам домен хоста і номер порту , як так: "example.com:8080".

Якщо ви хочете лише значення для домену хосту або потрібно лише значення для номера порту, то ви можете отримати доступ до цих властивостей окремо (тобто Request.Host.Hostабо Request.Host.Port).


6

Прийнята відповідь допомогла мені, як і коментар до неї від @padigan, але якщо ви хочете включити параметри рядка запитів, як це було у мене, то спробуйте це:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

І вам потрібно буде додати @using Microsoft.AspNetCore.Http.Extensionsв представлення для того, щоб метод GetEncodedPathAndQuery () був доступний.


1

Існує чистий спосіб отримати поточну URL-адресу зі сторінки Razor або класу PageModel. Це є:

Url.PageLink()

Зауважте, що я мав на увазі "ASP.NET Core Razor Pages ", а не MVC.

Я використовую цей метод, коли хочу надрукувати канонічний метатег URL-адрес на сторінках бритви ASP.NET Core. Але є улов. Це дасть вам URL-адресу, яка повинна бути правильною URL-адресою для цієї сторінки. Дозволь пояснити.

Скажімо, ви визначили для своєї сторінки маршрут з назвою "id", і тому ваша URL-адреса повинна виглядати так

http://example.com/product?id=34

Url.PageLink () надасть вам саме таку URL-адресу, як показано вище.

Тепер, якщо користувач додає щось додаткове до цієї URL-адреси, скажіть,

http://example.com/product?id=34&somethingElse

Тоді ви не отримаєте це "щосьElse" від цього методу. І саме тому він цілком гарний для друку канонічного метатега URL на сторінці HTML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.