Создавайте динамические пользовательские интерфейсы с помощью Blazor и XML

#c# #dynamic #devexpress #blazor #single-page-application

Вопрос:

Я изучал способы создания веб-клиента с использованием C#, который представляет собой одну страницу и создается из XML-файлов.

По сути, я хочу иметь службу, которая генерирует XML-файлы, описывающие пользовательский интерфейс, например, форм (не проблема). Эти XML — файлы отправляются клиенту, который, в свою очередь, считывает XML и динамически создает макет со всеми элементами управления. Я надеялся сделать это в веб-сборке Blazor (я также посмотрел на ASP.NET Веб-формы, MVC и ЯДРО (с использованием DevExpress), но ни один из них на самом деле не предназначен для клиентов SPA).

Для сравнения: У нас есть приложение для Android, которое в основном делает это, аналогично тому, что описано прямо здесь: https://developer.ibm.com/tutorials/x-andddyntut/

Но на этот раз я не разрабатываю приложение для Android на Java, это должен быть веб-клиент. И поскольку у большинства программистов в компании есть VB.NET предыстория, мой начальник отдела хотел бы, чтобы он использовал C#. Но я пытался найти способы сделать что-то подобное и наткнулся на множество тупиков, так как обычно Blazor используется со статическими страницами со времен разработки. Например, мне не удалось заставить его работать с фрагментами визуализации.

Любые указатели на это были бы очень признательны!

Искренне,

г-н

Комментарии:

1. Вы и используйте словарь для сопоставления типа модели данных с компонентом razor.

2. Боюсь, я не смогу уследить за вами. Я нашел способы добавить, например, один компонент или список компонентов одного и того же типа. Но я не нашел способа добавить весь макет, включая функции.

3. В нынешнем виде этот вопрос недостаточно сфокусирован. Не могли бы вы, пожалуйста, показать больше (кода) того, что вы пробовали и где вы застряли?

4. На самом деле у меня не так много кода для показа, так как я, по сути, искал только способы (учебные пособия, документация,…) полностью динамически добавлять компоненты в макет, определяемый, например, XML. Все, что я нашел, это фрагменты рендеринга (как описано в docs.microsoft.com/en-us/aspnet/core/blazor/components/… ). Они, похоже, работают только с заранее определенным списком или чем-то подобным, а не с тем, что работает для меня, мне нужно создать весь макет. Мой вопрос на самом деле не выходит за рамки «возможно ли это вообще? Как? Альтернативы?».

5. @M. R. Это poc, который я создал с помощью json. github.com/BrianLParker/ModelToComponent

Ответ №1:

Ответ №2:

Не прямой ответ на динамическое создание форм, а предлагаемый альтернативный метод.

Для моего приложения у меня есть ряд сервисов, которые имеют разные свойства, но основаны на базовом общем базовом классе. Службы, определенные в нескольких стандартных библиотеках .NET для каждого типа. Услуги — это такие вещи, как VoIP, широкополосная связь, FTTC, Ethernet, Заказы маршрутизаторов и т. Д. И т. Д.-Не так много общего, и очень разные типы данных и поведения.

Базовый класс обслуживания имеет абстрактный метод, GetView который возвращает тип C#, который является типом компонента Razor. Помните, что в Blazor все эти компоненты являются просто классами C#. Возвращаемый тип является компонентом Razor в той же библиотеке (поэтому у нас есть пользовательский интерфейс, а также инкапсуляция бизнес-логики и логики сущностей).

Родительский сайт загружает определенный тип службы, вызывает GetView и привязывает службу к результирующему компоненту.

Это довольно сложно описать, но я сделал концептуальное приложение для этого подхода в первые дни Blazor, когда понял, что он будет способен к такому подходу: https://github.com/conficient/BlazorDynamicList

Существует также демонстрационный сайт по адресу https://blazordynamiclist.azurewebsites.net/

Я не буду здесь подробно объяснять все это, но это следует аналогичному подходу. Существует абстрактный базовый класс ProductBase , у которого есть абстрактный метод GetViewComponent . Каждый продукт может вернуть свой предпочтительный компонент бритвы для отображения.

«Волшебство» — это DynamicComponent.cs, который является компонентом Razor с BuildRenderTree методом, который создает связанный экземпляр представления компонентов продукта.