Nas versões anteriores do asp.net, podíamos usar
@Request.Url.AbsoluteUri
Mas parece que mudou. Como podemos fazer isso no asp.net core 1.0?
Nas versões anteriores do asp.net, podíamos usar
@Request.Url.AbsoluteUri
Mas parece que mudou. Como podemos fazer isso no asp.net core 1.0?
Respostas:
Você deve obter o host e o caminho separadamente.
@Context.Request.Host@Context.Request.Path
@
entre as duas cordas? você poderia explicar isso?
@HttpContext
vez de @Context
. Para @Context
obras de vistas parciais . Eu esqueci de usar?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Você precisa de esquema, host, caminho e queryString
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
ou usando o novo recurso C # 6 "interpolação de string"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Você pode usar o método de extensão de Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
então@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Baseado nisso, acho que a solução do @tmg é a melhor (talvez envolvida em seu próprio método de extensão).
Isso aparentemente sempre foi possível em .net core 1.0 com Microsoft.AspNetCore.Http.Extensions
, que adiciona a extensão a HttpRequest
para obter o URL completo; GetEncodedUrl .
por exemplo, da visão de navalha:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Desde 2.0, também tem caminho relativo e consulta GetEncodedPathAndQuery .
Use a propriedade AbsoluteUri do Uri, com .Net core você tem que construir o Uri a partir de um pedido como este,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
por exemplo, se o url do pedido for ' http://www.contoso.com/catalog/shownew.htm?date=today ', ele retornará o mesmo url.
Você pode considerar o uso deste método de extensão (do Microsoft.AspNetCore.Http.Extensions
namespace:
@Context.Request.GetDisplayUrl()
Para alguns meus projetos, prefiro uma solução mais flexível. Existem dois métodos de extensão.
1) O primeiro método cria Uri
objeto a partir de dados de solicitação de entrada (com algumas variantes por meio de parâmetros opcionais). 2) O segundo método recebe o Uri
objeto e retorna string
no seguinte formato (sem barra final): 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);
}
Uso:
//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
? Isso não vai funcionar com Microsoft.AspNetCore.Http.HttpContext.Request
Se você deseja obter o número da porta da solicitação, será necessário acessá-lo por meio doRequest.Host
propriedade do AspNet Core.
A Request.Host
propriedade não é simplesmente uma string, mas, em vez disso, um objeto que contém o domínio do host e o número da porta. Se o número da porta é especificamente escrito para fora na URL (ou seja "https://example.com:8080/path/to/resource"
), em seguida, chamar Request.Host
lhe dará o domínio do host eo número da porta da seguinte forma: "example.com:8080"
.
Se você quiser apenas o valor para o domínio do host ou apenas o valor para o número da porta, poderá acessar essas propriedades individualmente ( Request.Host.Host
ou seja, ou Request.Host.Port
).
A resposta aceita me ajudou, assim como o comentário de @padigan, mas se você quiser incluir os parâmetros de string de consulta como era o meu caso, tente isto:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
E você precisará adicionar @using Microsoft.AspNetCore.Http.Extensions
a visualização para que o método GetEncodedPathAndQuery () esteja disponível.
Existe uma maneira limpa de obter o URL atual de uma página do Razor ou classe PageModel. Isso é:
Url.PageLink()
Observe que eu quis dizer as "Páginas ASP.NET Core Razor", não o MVC.
Eu uso esse método quando desejo imprimir a metatag canônica de URL nas páginas do ASP.NET Core. Mas há um porém. Ele lhe dará a URL que deve ser a URL certa para aquela página. Deixe-me explicar.
Digamos que, de acordo com a rota que você definiu para uma página, seu URL deve ser semelhante a
Digamos que você definiu uma rota "Id" para sua página. Portanto, Url.PageLink () fornecerá exatamente esse URL. Se o usuário adicionar algo extra nesse URL, digamos,
Então, você não obterá aquele "somethingElse" com este método. E é por isso que ele é exatamente bom para imprimir metatags de URL canônicas na página HTML.