Добавление серверной версии Blazor в существующее приложение MVC Core - PullRequest
4 голосов
/ 21 мая 2019

У меня полностью работающий серверный проект Blazor и проект .NET Core 3 MVC, оба в одном решении. Сейчас я пытаюсь использовать компоненты из проекта Blazor в моем проекте MVC.

Мне удалось заставить компоненты отображаться на странице MVC, но нажатие кнопки на компоненте Blazor не вызывает события onclick для компонентов, вместо этого я просто перехожу на https://localhost:44341/?

Мне неясно, какие именно изменения мне нужно внести в решение MVC, чтобы это работало? Официальная документация говорит об использовании компонентов в проекте MVC , и она упоминается в этом видеочате с Даном Ротом , но ни в одном из них не говорится о том, как этого добиться.

Может ли кто-нибудь рассказать мне о том, как полностью интегрировать Blazor на стороне сервера в проект MVC (или указать на пример)?

Что я пробовал

В моем проекте Blazor все еще есть стандартный компонент Counter, поэтому я попытался добавить его в свое решение MVC, сославшись на проект Blazor, а затем добавив его в мой файл index.cshtml:

<div id="Counter">
  @(await Html.RenderComponentAsync<Counter>())
</div>

Это правильно, но нажатия кнопок не работают.

Я добавил файл JS на страницу _Layout приложений MVC:

<script src="_framework/blazor.server.js"></script>

Включен серверный блейзор в файле Startup.cs проекта MVC:

services.AddServerSideBlazor();

Я также добавил в проект MVC каталоги Pages и Shared и скопировал файлы _Imports и MainLayout - не уверен, если это необходимо.

Когда это не сработало, я попытался раскрутить новые проекты из всех шаблонов Blazor (клиентских, клиентских и серверных), чтобы найти подсказки, но все эти примеры настроены как полные SPA с одна точка входа Blazor (файл App), размещенная в файле .html, тогда как я хочу визуализировать компоненты Blazor на множестве различных существующих страниц MVC.

Затем я экспериментировал с добавлением частей этих проектов (и частей моего рабочего проекта Blazor) в проект MVC, но не могу заставить его работать полностью.

Я также пытался следовать ответу здесь , но это работает с добавлением файлов компонентов Blazor в проект MVC, тогда как мои файлы Blazor в настоящее время (в основном) находятся в другом проекте.

Случайные вопросы из моих экспериментов на сегодняшний день

  • Я добавил services.AddServerSideBlazor(); в Startup.cs приложения MVC. там что-нибудь еще нужно?
  • Мое приложение MVC по-прежнему работает на традиционном AspNetCore.Routing, нужно ли мне переключаться на маршрутизацию конечной точки Core 3, если я размещаю компоненты только на существующих страницах MVC (т. Е. У меня не будет страниц Blazor, только компоненты Blazor ).
  • Нужна ли маршрутизация конечной точки серверной части Blazor, с которой взаимодействует javascript-файл blazor, работающий в браузере (через SignalR)? Я получаю 404 в браузере из файла js.
  • Мне все еще нужен класс / страница App (App.razor) в качестве точки входа, если я просто размещаю компоненты?
  • Если это так, нужно ли поместить строку <app>@(await Html.RenderComponentAsync<App>())</app> из _Host.cshtml где-нибудь в моем проекте MVC?
  • Нужно ли воспроизводить папки «Страницы» и «Общие папки» из проекта Blazor в моем проекте MVC, а также два файла _Imports.razor и файл MainLayout.razor?
  • Я думаю, что Blazor теперь является частью файла Microsoft.NETCore.Platforms (на который ссылаются под узлом SDK в проекте MVC), поэтому я прав, что мне не нужно добавлять отдельные пакеты NuGet для Blazor в MVC проект?

1 Ответ

5 голосов
/ 21 мая 2019

Я дошел до сути этого сейчас. После всех проб и ошибок, описанных в моем вопросе, решение оказалось на удивление небольшим количеством кода.

Пример с серверной блейзором и MVC в разных проектах в одном решении

Ответ ниже предполагает, что у вас есть работающий серверный проект Blazor в вашем решении и вы пытаетесь использовать компоненты из этого проекта в отдельном проекте MVC в этом же решении. Я сделал это в VS2019, используя Core 3 Preview 5.

См. Внизу страницы или ссылку на пример MVC и Blazor в том же проекте.

Изменения в файле .csproj проекта MVC

Вам просто нужно добавить ссылку на ваш блазорский проект:

    <ProjectReference Include="..\MyClient.Web.Blazor\MyClient.Web.Blazor.csproj" />

Изменения в файле Views \ Shared \ _Layout.cshtml проекта MVC

Добавить ссылку на скрипт Blazor JS

<script src="_framework/blazor.server.js"></script>

(на самом деле его нет в вашей локальной файловой системе, Blazor автоматически сортирует его к тому времени, когда приложение попадает в браузер)

Изменения в Startup.cs

проекта MVC

Вот где настоящая работа сделана

В методе ConfigureServices добавьте:

services.AddServerSideBlazor();

Затем я переключил свою конфигурацию на конфигурацию Core 3 нового стиля (поэтому больше не использовал метод AddMvc):

services.AddControllersWithViews()            
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

services.AddRazorPages();

И затем изменение, которое, наконец, заставило меня работать, состояло в том, чтобы переключиться на маршрутизацию конечной точки Core 3 в методе Configure(IApplicationBuilder app, IWebHostEnvironment env):


app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    endpoints.MapRazorPages();
    endpoints.MapBlazorHub();
});

//app.UseMvc(routes =>
//{
//    routes.MapRoute(
//        name: "MyArea",
//        template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

//    routes.MapRoute(
//        name: "default",
//        template: "{controller=Home}/{action=Index}/{id?}");
//});

Закомментированный код показывает маршрутизацию старого стиля, которую я использовал. Я думаю, что из-за отсутствия endpoints.MapBlazorHub(); моя проблема с нажатием кнопки

Изменения в проекте Blazor

Никаких изменений в проекте Blazor не потребовалось, чтобы это заработало.

Как поместить компонент Blazor на страницу MVC

После того, как вы выполнили все вышеперечисленное, все, что нужно для отображения компонента на странице MVC, - это добавление

 @(await Html.RenderComponentAsync<YourComponent>())

Это должно работать как на странице MVC, так и на странице Razor.

Известная проблема маршрутизации в Core 3 Preview 5

Выше были внесены изменения, чтобы все заработало. Существует известная проблема с Core 5 , когда после перехода на страницу MVC или Razor с компонентом Blazor маршрутизация больше не будет работать до тех пор, пока страница не будет обновлена ​​- URL-адреса изменятся в браузере. адресная строка, но навигации не будет.

Сейчас я работаю в Preview 6 и могу подтвердить, что проблема с маршрутизацией теперь исправлена ​​в Preview 6 и далее.

Пример с серверным блейзором и MVC в одном проекте

У Криса Сэйнти есть пример серверных компонентов Blazor, добавленных в существующий проект MVC здесь: Использование компонентов Blazor в существующем приложении MVC ( источник здесь )

...