Как перенаправить на другой маршрут в Blazor на стороне сервера - PullRequest
0 голосов
/ 04 января 2019

Только в Blazor Client перенаправление может быть достигнуто с помощью

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

Это не работает на стороне сервера, оно генерирует ошибку

Невозможно привести объект типа «Microsoft.AspNetCore.Blazor.Server.Circuits.RemoteJSRuntime» к типу «Microsoft.JSInterop.IJSInProcessRuntime».

Как перенаправить на сервер Blazor?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

После времени и времени экспериментов я обнаружил, что на стороне сервера это работает:

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

Конечно, выглядит почти так же, но работает (по крайней мере, в Blazor 0.8)

0 голосов
/ 16 января 2019

Не совсем то, что вы ищете, но, тем не менее, "решение". Я не могу найти способ в настоящее время сделать что-то похожее на 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", который вы можете вызывать из любого компонента, производного от класса базового компонента.

...