15

在 Blazor 客户端中,可以使用以下方式实现重定向

using Microsoft.AspNetCore.Blazor.Browser.Services;
(...)
BrowserUriHelper.Instance.NavigateTo("/route")

但是,这在 Blazor Server 项目中不起作用,因为它会生成以下错误:

无法将类型为“Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime”的对象转换为类型“Microsoft.JSInterop.IJSInProcessRuntime”。

Blazor-Server 中的重定向是什么样的?

4

3 回答 3

40

如果可以在剃须刀页面上触发,可以使用以下方法:

@page "/YourPageName"
@inject NavigationManager NavigationManager

<h1>xxx</h1>
.
.
.


@code {

    void MethodToTriggerUrl()
    {
        NavigationManager.NavigateTo("PageToRedirect");
    }
}
于 2019-10-16T15:43:54.857 回答
8

经过一段时间的试验,我发现在服务器端这是有效的:

using Microsoft.AspNetCore.Blazor.Services;
(...)
UriHelper.NavigateTo("/route");

当然,看起来几乎一样,但确实有效(至少在 Blazor 0.8 中)

于 2019-01-22T06:40:38.250 回答
3

不完全是您正在寻找的东西,但仍然是“解决方案”。我目前似乎无法找到一种方法,在服务器端执行类似于 Response.Redirect 的操作,但使用 jsinterop,在您希望能够重定向 FROM 的组件中,使用类似这样的东西。请注意,我也很好奇,并且知道这也会为我自己提出,我做了以下事情:

因此,基于带有服务器端项目模板的示例应用程序......

索引.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”之类的方法放在一个单独的类中,并将其用作大多数组件页面的基类。

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;

现在,您应该有一个“重定向”方法,您可以从派生自您的基组件类的任何组件调用。

于 2019-01-16T14:33:04.017 回答