Как перенаправить на другой маршрут в Blazor на стороне сервера
Только в Blazor Client перенаправление может быть достигнуто с помощью
using Microsoft.AspNetCore.Blazor.Browser.Services;
(...)
BrowserUriHelper.Instance.NavigateTo("/route")
Это не работает на стороне сервера, оно генерирует ошибку
Невозможно привести объект типа "Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime" к типу "Microsoft.JSInterop.IJSInProcessRuntime".
Как перенаправить на сервер Blazor?
2 ответа
После многих экспериментов я обнаружил, что на стороне сервера это работает:
using Microsoft.AspNetCore.Blazor.Services;
(...)
UriHelper.NavigateTo("/route");
Конечно, выглядит почти так же, но работает (по крайней мере, в Blazor 0.8)
Если вы можете запускать на странице бритвы, вы можете использовать следующее:
@page "/YourPageName"
@inject NavigationManager NavigationManager
<h1>xxx</h1>
.
.
.
@code {
void MethodToTriggerUrl()
{
NavigationManager.NavigateTo("PageToRedirect");
}
}
Не совсем то, что вы ищете, но, тем не менее, "решение". Я не могу найти способ в настоящее время сделать что-то похожее на 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 поместите ссылку на этот файл 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", который вы можете вызывать из любого компонента, производного от класса базового компонента.