Рецепт идеального приложения
Blazor… Сколько шума наделала эта технология. Все хотели посмотреть на вторую попытку Microsoft привнести C# в создания интерфейсов. Не уже ли у них это получилось? Давай разберемся.
Как всегда, я создам приложения, но на этот раз не буду создавать приложения по шаблону Blazor App. На этот раз я создам приложения по типу ASP.NET Core MVC и добавлю в него Blazor Component.
Моё приложения будет эмитирует онлайн кинотеатр.
Первое что надо сделать - это создать новый проект по типу Empty.
При создании проект обратите особое внимания на версию .Net Core. Версия должна быть >= 3.1.x
Далее нужно настроить приложения для работы как с инфраструктурой MVC и Blazor.
Для этого добавим в класс Startup.cs следующее:
Первое, что бросается в глаза (ну лично для меня) так это то, что в версии .Net Core 3.1 изменилось подключения сервисов необходимое для работы MVC.
Теперь вместо
мы имеем
Второе нововведение — это изменение настройки маршрутизации.
В .Net Core 2.x настройка маршрутизации проходила следующим образом:
В новой версии .Net Core настройка маршрута происходит следующим способом:
Как по мне такой вариант инициализации машрутов лучше отображается действительность. По мимо MVC приложения также имеются и другие типы приложения. Например: Razor Pages, Web API и Blazor. Именно, поэтому настройка маршрута через метод, который называется UseMvc(), не логична.
Далее необходимо подготовить основную модель для онлайн кинотеатра, которая будет отображаться реальный фильм:
Так же надо ввести типы имеющихся фильмов. Это можно сделать с помощью MovieType:
Далее нужно реализовать отображения фильмов, которые имеются в кинотеатре. Для этого воспользуемся Blazor Component. Компонент будет принимать модель фильма, отображать имя и описания конкретного фильма ну и с эмитируем постер фильма (для этого я буду отображать “заглушку”). Так же компонент должен реагировать на взаимодействия с мышью, т.е. изменить при наведения мыши.
В итоге получилось так:
Из исходного кода компонента видно, что он не представляет ничего сложного. В данном компоненте происходит обработка таких событий как: onmouseover, onmouseout и onclick.
После написания данного компонента нужно его проверить. Для этого запустим приложения …, и оно не работает. Точнее будет, если я скажу, что компонент, который я написал работает только на первой страницы.
Поиске на этот вопрос не дали ничего. Мне даже пришлось спросить у команды, которая занимается разработкой Blazor.
И после ответа от команды Blazor я понял в чем была моя ошибка. Оказывается, что бы Blazor Component работал во всем приложении нужно указать специальный тэг:
Результат:
После этого я реализовал фильтрацию фильмов по категориям (по типам) и открытие “карточки” фильма. Для этого я создал MovieController.cs, которые имеет следующее методы:
Код реализации репозитория можно посмотреть в GitHub.
У каждого фильма есть свои оценки/комментарии от пользователей. Я хочу реализовать что-то подобное и в моем приложение. Для начало создадим сущность, которая будет отображать комментарии для определенного фильма. Данная сущность показана ниже
Так же я реализую контроллер, который будет возвращать комментарии для определённого фильма и добавлять их. Ниже показать код контроллера CommentController.cs:
Так же нужно реализовать компонент для комментариев. Он должен уметь отображать существующее комментарии к определённому фильму, в карточке которого я сейчас нахожусь, и дать возможность пользователю добавлять новые комментарии. Вот что получилось:
Как видно из кода выше CommentsComponent.razor представляет из себя EditForm и список уже существующих комментариев. EditForm - это стандартный компонент, который представляет из себя надстройку над существующей form из Html.Это надстройка позволяет реагировать на submit только, когда Model прошла валидацию (OnValidSubmit=””) или наоборот, когда модель не прошла валидцию (OnInvalidSubmit=””). Эти методы дают возможность контролировать внешний вид компонента при валидации модели. Но в я использую услвоную нажатие на кнопку без проверки входящей модели.
Так же в секции @code видно два метода, которые взаимодействуют с сервером при помощи HttClient. Первое взаимодействия происходит в методе OnInitializedAsync. В данном методе происходит запрос всех комментариев по данному фильму. Второе взаимодействия происходит в методе OnCreateNewComment. В этом методе я отправляю новый комментарий на сервер.
Ниже можно посмотреть результат того:
Вместо вывода:
Blazor+ASP.NET Core MVC сдружить можно, но у меня возникли некоторые проблемы с этим. Первое с чем я столкнулся это то, что в к версии .NET Core < 3.1.x есть проблема при передачи параметра в компонент, т.е. при таком виде
происходило исключения. Это проблема решается путем обновления .NET Core до версии 3.1.
Вторая не приятная ситуация, с которой пришлось столкнуться — это необходимость указания тэга в мастере страниц, для того чтобы компоненты Blazor работали во всем приложение.
В целом мне очень понравилось комбинировать ASP.NET Core MVC и Blazor Component. Надеюсь, при написание вашего проекта у вас не возникнет таких проблем.