У попередніх версіях 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.