asp.netの以前のバージョンでは、
@Request.Url.AbsoluteUri
しかし、変更されたようです。asp.netコア1.0でそれを行うにはどうすればよいですか?
asp.netの以前のバージョンでは、
@Request.Url.AbsoluteUri
しかし、変更されたようです。asp.netコア1.0でそれを行うにはどうすればよいですか?
回答:
ホストとパスを個別に取得する必要があります。
@Context.Request.Host@Context.Request.Path
@
2つの文字列の間のこれは何ですか?説明していただけますか?
@HttpContext
代わりに使用する必要がありました@Context
。部分ビューでは@Context
機能します。私は使用を忘れましたか?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/...
スキーム、ホスト、パス、クエリ文字列が必要です
@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コア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も含まれています。
Uriの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()
一部のプロジェクトでは、より柔軟なソリューションを好んでいます。2つの拡張メソッドがあります。
1)最初のメソッドはUri
、着信要求データからオブジェクトを作成します(オプションのパラメーターを介して一部のバリアントを使用)。2)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()メソッドを使用できるようにするには、ビューに追加する必要 があります。
RazorページまたはPageModelクラスから現在のURLを取得するクリーンな方法があります。あれは:
Url.PageLink()
MVCではなく、「ASP.NET Core Razorページ」を意味したことに注意してください。
ASP.NET Coreかみそりのページで正規URLメタタグを印刷するときに、この方法を使用します。しかし、落とし穴があります。それはあなたにそのページの正しいURLであるはずのURLを与えます。説明させてください。
たとえば、ページに定義したルートに従って、URLは次のようになります
たとえば、ページのルート「Id」を定義したとします。したがって、Url.PageLink()は正確にそのURLを提供します。ユーザーがそのURLに何か追加すると、
その後、このメソッドからその「somethingElse」を取得しません。そしてそれが、HTMLページで標準URLメタタグを印刷するのにぴったりの理由です。