如何重定向到 Blazor 服务器端的不同路由
How to redirect to a different route in Blazor Server-side
在 Blazor 客户端中,可以使用
实现重定向
using Microsoft.AspNetCore.Blazor.Browser.Services;
(...)
BrowserUriHelper.Instance.NavigateTo("/route")
但这在 Blazor Server 项目中不起作用,因为它会生成以下错误:
Unable to cast object of type 'Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime' to type 'Microsoft.JSInterop.IJSInProcessRuntime'.
Blazor-Server 中的重定向是什么样的?
不完全是您要查找的内容,但 "a solution" 仍然是。我目前似乎无法找到一种方法,在服务器端做类似于 Response.Redirect 的事情,但是使用 jsinterop,在你希望能够重定向的组件中,使用类似的东西。请注意,我也很好奇,并且知道这也会出现在我自己身上,我做了以下事情:
因此基于带有服务器端项目模板的示例应用...
index.cshtml
@using Microsoft.JSInterop;
<a href="#" class="btn btn-primary" onclick="@GoSomewhere">Go somewhere with Blazor</a>
@functions {
protected void GoSomewhere()
{
RedirectTo("/FetchData"); //or any other "page" in your pages folder
}
public static Task<string> RedirectTo(string path)
{
return JSRuntime.Current.InvokeAsync<string>(
"clientJsfunctions.RedirectTo", path);
}
}
然后,在 wwwwroot 文件夹下,放置一个 javascript 文件,其中包含:
window.clientJsfunctions = {
RedirectTo: function (path) {
window.location = path;
}
};
最后,在您的引导程序文件中,index.html,放置一个对此 js 文件的引用
<body>
<app>Loading...</app>
<script src="_framework/blazor.server.js"></script>
<script src="scripts/ClientUtil.js"></script>
</body>
更好的是,将上述 "RedirectTo" 之类的方法放在单独的 class 中,并将其用作大多数组件页面的基础 class。
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Blazor.Components;
using Microsoft.JSInterop;
namespace MyApp.Web.App.Shared
{
public class MycomponentBase : BlazorComponent
{
public static Task<string> RedirectTo(string path)
{
return JSRuntime.Current.InvokeAsync<string>(
"clientJsfunctions.RedirectTo", path);
}
}
}
还有,记得把这个放在每个组件的顶部
@inherits MycomponentBase;
现在,您应该有一个 "Redirect" 方法,您可以从派生自基本组件 class 的任何组件调用该方法。
经过多次试验,我发现在服务器端这是可行的:
using Microsoft.AspNetCore.Blazor.Services;
(...)
UriHelper.NavigateTo("/route");
当然,看起来几乎一样,但确实有效(至少在 Blazor 0.8 中)
如果可以在razor页面上触发,可以使用如下:
@page "/YourPageName"
@inject NavigationManager NavigationManager
<h1>xxx</h1>
.
.
.
@code {
void MethodToTriggerUrl()
{
NavigationManager.NavigateTo("PageToRedirect");
}
}
在 Blazor 客户端中,可以使用
实现重定向using Microsoft.AspNetCore.Blazor.Browser.Services;
(...)
BrowserUriHelper.Instance.NavigateTo("/route")
但这在 Blazor Server 项目中不起作用,因为它会生成以下错误:
Unable to cast object of type 'Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime' to type 'Microsoft.JSInterop.IJSInProcessRuntime'.
Blazor-Server 中的重定向是什么样的?
不完全是您要查找的内容,但 "a solution" 仍然是。我目前似乎无法找到一种方法,在服务器端做类似于 Response.Redirect 的事情,但是使用 jsinterop,在你希望能够重定向的组件中,使用类似的东西。请注意,我也很好奇,并且知道这也会出现在我自己身上,我做了以下事情:
因此基于带有服务器端项目模板的示例应用...
index.cshtml
@using Microsoft.JSInterop;
<a href="#" class="btn btn-primary" onclick="@GoSomewhere">Go somewhere with Blazor</a>
@functions {
protected void GoSomewhere()
{
RedirectTo("/FetchData"); //or any other "page" in your pages folder
}
public static Task<string> RedirectTo(string path)
{
return JSRuntime.Current.InvokeAsync<string>(
"clientJsfunctions.RedirectTo", path);
}
}
然后,在 wwwwroot 文件夹下,放置一个 javascript 文件,其中包含:
window.clientJsfunctions = {
RedirectTo: function (path) {
window.location = path;
}
};
最后,在您的引导程序文件中,index.html,放置一个对此 js 文件的引用
<body>
<app>Loading...</app>
<script src="_framework/blazor.server.js"></script>
<script src="scripts/ClientUtil.js"></script>
</body>
更好的是,将上述 "RedirectTo" 之类的方法放在单独的 class 中,并将其用作大多数组件页面的基础 class。
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Blazor.Components;
using Microsoft.JSInterop;
namespace MyApp.Web.App.Shared
{
public class MycomponentBase : BlazorComponent
{
public static Task<string> RedirectTo(string path)
{
return JSRuntime.Current.InvokeAsync<string>(
"clientJsfunctions.RedirectTo", path);
}
}
}
还有,记得把这个放在每个组件的顶部 @inherits MycomponentBase;
现在,您应该有一个 "Redirect" 方法,您可以从派生自基本组件 class 的任何组件调用该方法。
经过多次试验,我发现在服务器端这是可行的:
using Microsoft.AspNetCore.Blazor.Services;
(...)
UriHelper.NavigateTo("/route");
当然,看起来几乎一样,但确实有效(至少在 Blazor 0.8 中)
如果可以在razor页面上触发,可以使用如下:
@page "/YourPageName"
@inject NavigationManager NavigationManager
<h1>xxx</h1>
.
.
.
@code {
void MethodToTriggerUrl()
{
NavigationManager.NavigateTo("PageToRedirect");
}
}