c# - 获取 Blazor 组件中的当前 URL
问题描述
我需要知道当前页面的 URL 以检查是否必须将某种样式应用于元素。下面的代码是一个例子。
@using Microsoft.AspNetCore.Blazor.Services
@inject IUriHelper UriHelper
@implements IDisposable
<h1>@url</h1>
<nav>
<div class="nav-wrapper">
<a href="#" class="brand-logo">Blazor</a>
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li>
<NavLink href="/" Match=NavLinkMatch.All>
Home
</NavLink>
</li>
<li>
<NavLink href="/counter">
Counter
</NavLink>
</li>
<li>
<NavLink href="/fetchdata">
Fetch data
</NavLink>
</li>
</ul>
</div>
</nav>
@functions {
private string url = string.Empty;
protected override void OnInit()
{
url = UriHelper.GetAbsoluteUri();
UriHelper.OnLocationChanged += OnLocationChanged;
}
private void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
url = newUriAbsolute;
}
public void Dispose()
{
UriHelper.OnLocationChanged -= OnLocationChanged;
}
}
我使用了在 Blazor 存储库中的 NavLink 组件中使用的相同方法,但它不起作用。有任何想法吗?。
解决方案
使用类中的Uri
属性NavigationManager
。
这个怎么运作
在页面上使用它之前从注入中获取它.razor
:
@inject NavigationManager MyNavigationManager
或者.cs
如果您更喜欢“代码隐藏”体验,可以在文件中这样:
using Microsoft.AspNetCore.Components;
...
[Inject]
public NavigationManager MyNavigationManager {get; set;}
样本
@page "/navigate"
@inject NavigationManager MyNavigationManager
<h1>Current URL</h1>
<p>@(MyNavigationManager.Uri)</p>
有关导航(NavigateTo、BaseUri、ToAbsoluteUri、ToBaseRelativePath、...)的更多信息,请参见:URI 和导航状态助手
NavigationManager 备忘单
MyNavigationManager.Uri
#> https://localhost:5001/counter/3?q=hi
MyNavigationManager.BaseUri
#> https://localhost:5001/
MyNavigationManager.NavigateTo("http://new location")
#> Navigates to new location
MyNavigationManager.LocationChanged
#> An event that fires when the navigation location has changed.
MyNavigationManager.ToAbsoluteUri("pepe")
#> https://localhost:5001/pepe
MyNavigationManager.ToBaseRelativePath(MyNavigationManager.Uri)
#> counter/3?q=hi
Helper: AddQueryParm( "q2", "bye" ) // (*1)
#> https://localhost:5001/counter/3?q=hi&q2=bye
Helper: GetQueryParm( "q" )
#> hi
(*1)
Net6 介绍GetUriWithQueryParameter
。更多信息:从 Blazor 操作查询字符串
助手代码:
@code {
[Parameter]
public string Id { get; set; }
// Blazor: add parm to URL
string AddQueryParm(string parmName, string parmValue)
{
var uriBuilder = new UriBuilder(MyNavigationManager.Uri);
var q = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
q[parmName] = parmValue;
uriBuilder.Query = q.ToString();
var newUrl = uriBuilder.ToString();
return newUrl;
}
// Blazor: get query parm from the URL
string GetQueryParm(string parmName)
{
var uriBuilder = new UriBuilder(MyNavigationManager.Uri);
var q = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);
return q[parmName] ?? "";
}
}
推荐阅读
- tensorflow - 什么是 Tensorflow 版本 2.0.0 中没有属性“GraphDef”的“tensorflow”?
- c# - 将 RemoteAuthenticationHandler CallbackPath 与 IApplicationBuilder 路径匹配一起使用
- java - 如何在我的代码中实现“BigInteger 到 Integer,反之亦然”,无法解决不兼容的类型错误
- java - 使用私钥生成 JSON Web 令牌 (JWT)
- google-colaboratory - 如何以编程方式检查连接到哪个运行时 Google Colab 笔记本?
- postgresql - 如何设置 Narayana ConnectionManager 使其在某些事务后不会停止
- rust - 如何在 rust 中找到或插入 Vec
- c# - 是否可以通过 PostgreSQL 的某些 IF 条件使用 WHERE?
- amazon-web-services - 如何通过 AWS cognito 的订阅者(获取帖子列表)获取多个用户?
- python-3.x - map() 函数如何在 python 中工作?