У попередніх версіях asp.net ми могли використовувати
@Request.Url.AbsoluteUri
Але, схоже, це змінилося. Як ми можемо це зробити в ядрі asp.net 1.0?
У попередніх версіях asp.net ми могли використовувати
@Request.Url.AbsoluteUri
Але, схоже, це змінилося. Як ми можемо це зробити в ядрі asp.net 1.0?
Відповіді:
Ви повинні отримати хост і шлях окремо.
@Context.Request.Host@Context.Request.Path
@
між двома струнами? ви могли б це пояснити?
@HttpContext
замість @Context
. Для часткових поглядів @Context
працює. Я забув використання?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604 / ...
Вам потрібна схема, хост, шлях та 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}")
Ви можете використовувати метод розширення Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
потім@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
На підставі цього я думаю, що рішення @ tmg є найкращим (можливо, обгорнуто вашим власним методом розширення).
Це, мабуть, завжди можливо в .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 .
Використовуйте властивість 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-адрес.
Ви можете розглянути можливість використання цього методу розширення (з 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¶m2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about
//before >> https://localhost:44304/information/about?param1=a¶m2=b
new Uri("https://localhost:44304/information/about?param1=a¶m2=b").GetHostWithNoSlash();
//after >> https://localhost:44304
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
Якщо ви також хочете отримати номер порту з запиту, вам потрібно буде отримати доступ до нього через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
).
Прийнята відповідь допомогла мені, як і коментар до неї від @padigan, але якщо ви хочете включити параметри рядка запитів, як це було у мене, то спробуйте це:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
І вам потрібно буде додати @using Microsoft.AspNetCore.Http.Extensions
в представлення для того, щоб метод GetEncodedPathAndQuery () був доступний.
Існує чистий спосіб отримати поточну 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.