如何在 asp.net core 1.0 中查看当前 url

Posted

技术标签:

【中文标题】如何在 asp.net core 1.0 中查看当前 url【英文标题】:How to get current url in view in asp.net core 1.0 【发布时间】:2016-07-18 12:41:00 【问题描述】:

在以前的asp.net版本中,我们可以使用

@Request.Url.AbsoluteUri

但它似乎改变了。我们如何在 asp.net core 1.0 中做到这一点?

【问题讨论】:

喜欢这个? ***.com/questions/28120222/… @DavidG 看来你现在可以使用 UriHelper.GetDisplayUrl(Re‌​quest) 【参考方案1】:

你必须分别获取主机和路径。

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

【讨论】:

如果您的应用程序位于虚拟目录中,这将不会报告正确的 url。如果有,您需要在 Request.Path 值前面加上 Request.PathBase 值。这也适用于该问题的几乎所有其他答案。 @MohammedNoureldin:这是剃刀视图语法。 对于剃须刀页面,我必须使用@HttpContext 而不是@Context。对于部分视图@Context 有效。我忘记使用了吗? MVC中有一个简单的方法Url.Action("Action", null, null, Request.Url.Scheme);***.com/questions/434604/… 您需要将Request.QueryString 添加到末尾,因为 Request.Path 不包含查询字符串【参考方案2】:

您需要方案、主机、路径和查询字符串

@string.Format("0://123", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

或使用新的 C#6 功能“字符串插值”

@($"Context.Request.Scheme://Context.Request.HostContext.Request.PathContext.Request.QueryString")

【讨论】:

如何获取片段,比如test.com/abc#123,如何从请求中获取#123 片段? @fanray 你不能。浏览器不会向服务器发送 URI 片段 考虑使用UriBuilder 构建url。【参考方案3】:

可以使用Request的扩展方法:

Request.GetDisplayUrl()

【讨论】:

如果您添加@using Microsoft.AspNetCore.Http.Extensions 然后@Context.Request.GetDisplayUrl(),则此方法有效 仍然得到 - 当前上下文中不存在请求 记住这个函数的intellisense摘要说Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.基于此,我认为@tmg的解决方案是最好的(也许包装在你自己的扩展方法中)。 如果您希望它在与以前相同类型的 Url 对象中,您可以在获得显示 url 后执行此操作:var uri = new Uri(displayUrl);【参考方案4】:

这在带有Microsoft.AspNetCore.Http.Extensions 的.net core 1.0 中显然总是可行的,它为HttpRequest 添加了扩展以获得完整的URL; GetEncodedUrl.

例如从剃刀的角度来看:

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

从2.0开始,也有相对路径和查询GetEncodedPathAndQuery。

【讨论】:

感谢您提供@using 声明【参考方案5】:

使用 Uri 的 AbsoluteUri 属性,使用 .Net 核心,您必须像这样从请求构建 Uri,

 var location = new Uri($"Request.Scheme://Request.HostRequest.PathRequest.QueryString");

 var url = location.AbsoluteUri;

例如如果请求 url 是 'http://www.contoso.com/catalog/shownew.htm?date=today' 这将返回相同的 url。

【讨论】:

这样的事情让我觉得 .Net Core 在某些方面是倒退了一步。这是否比我无法想象的 Asp.Net 中的 Request.Url 更好?【参考方案6】:

可以考虑使用这种扩展方式(来自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】:

接受的答案对我有帮助,@padigan 的评论对我也有帮助,但如果你想像我一样包含查询字符串参数,那么试试这个:

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

您需要在视图中添加 @using Microsoft.AspNetCore.Http.Extensions 才能使用 GetEncodedPathAndQuery() 方法。

【讨论】:

【参考方案8】:
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【参考方案9】:

如果您还希望从请求中获取端口号,则需要通过 AspNet Core 的 Request.Host 属性访问它。

Request.Host 属性不仅仅是一个字符串,而是一个包含主机域端口号的对象。如果在 URL 中明确写出端口号(即"https://example.com:8080/path/to/resource"),那么调用Request.Host 将为您提供主机域和端口号,如下所示:"example.com:8080"

如果您只需要主机域的值或只需要端口号的值,那么您可以单独访问这些属性(即Request.Host.HostRequest.Host.Port)。

【讨论】:

【参考方案10】:

有一种从 Razor 页面或 PageModel 类获取当前 URL 的简洁方法。那就是:

Url.PageLink()

请注意,我的意思是“ASP.NET Core Razor Pages”,而不是 MVC。

当我想在 ASP.NET Core razor 页面中打印规范 URL 元标记时,我使用此方法。但是有一个问题!它会为您提供应该是该页面正确 URL 的 URL。让我解释一下。

假设你已经为你的页面定义了一个名为“id”的路由,因此你的 URL 应该是这样的

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

Url.PageLink() 将为您提供如上所示的准确 URL。

现在,如果用户在该 URL 上添加任何额外内容,例如,

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

然后,您将不会从该方法中获得“其他东西”。这就是为什么它非常适合在 html 页面中打印规范的 URL 元标记。

【讨论】:

【参考方案11】:
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~Context.Request.Path.ValueContext.Request.QueryString";

【讨论】:

以上是关于如何在 asp.net core 1.0 中查看当前 url的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 1.0 的 DI 中的 Startup 类中添加 IHttpContextAccessor?

如何在 ASP.NET Core 1.0 应用程序中使用 SqlServer.Types / 空间类型

如何将项目引用添加到 ASP.NET Core 1.0 MVC 项目

ASP.NET Core 1.0 部署 HTTPS

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

在 ASP.NET Core 1.0 上处理大文件上传