仅在Blazor Client中,可以使用
实现重定向using Microsoft.AspNetCore.Blazor.Browser.Services;
(...)
BrowserUriHelper.Instance.NavigateTo("/route")
这在服务器端不起作用,它会生成错误
无法将类型为“ Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime”的对象转换为类型为“ Microsoft.JSInterop.IJSInProcessRuntime”的对象。
如何在Blazor服务器端重定向?
答案 0 :(得分:1)
经过反复的实验,我发现在服务器端这是可行的:
using Microsoft.AspNetCore.Blazor.Services;
(...)
UriHelper.NavigateTo("/route");
已授予,外观几乎相同,但是可以完成工作(至少在Blazor 0.8中如此)
答案 1 :(得分:1)
如果可以在剃须刀页面上触发,则可以使用以下内容:
@page "/YourPageName"
@inject NavigationManager NavigationManager
<h1>xxx</h1>
.
.
.
@code {
void MethodToTriggerUrl()
{
NavigationManager.NavigateTo("PageToRedirect");
}
}
答案 2 :(得分:0)
并不是您要找的东西,而是“解决方案”。目前,我似乎还找不到一种方法来在服务器端执行类似于Response.Redirect的方法,但是使用jsinterop,在您希望能够重定向FROM的组件中,使用类似的方法。请注意,我也很好奇,并且知道自己也会想到这一点,所以我做了以下事情:
因此,基于带有服务器端项目模板的示例应用程序...
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中,将该参考文件放置在该文件中
<body>
<app>Loading...</app>
<script src="_framework/blazor.server.js"></script>
<script src="scripts/ClientUtil.js"></script>
</body>
更好的是,将诸如“ RedirectTo”上方的方法放在单独的类中,并将其用作大多数组件页面的基类。
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;
现在,您应该有一个“重定向”方法,可以从基础组件类派生的任何组件中调用。