虽然不是您想要的完全解决方案,但仍然是“一种解决方案”。目前我似乎找不到一种类似于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);
}
}
然后,在wwwroot文件夹下,放置一个带有以下内容的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;
现在,您应该拥有一个“Redirect”方法,可以从任何派生自您基础组件类的组件中调用。