#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:
Вы можете создать динамический пользовательский интерфейс с помощью RenderTreeBuilder, но большая часть его поведения предназначена для внутреннего использования (например, RenderTreeFrame), и поэтому я не думаю, что это хорошая идея.
Короче говоря, я не верю, что то, чего вы хотите достичь, возможно.
Если эти XMLS не часто меняются, я бы подумал о создании транспилятора, который преобразует эти XMLS в код Blazor, а затем перекомпилирует приложение.
Ответ №2:
Для моего приложения у меня есть ряд сервисов, которые имеют разные свойства, но основаны на базовом общем базовом классе. Службы, определенные в нескольких стандартных библиотеках .NET для каждого типа. Услуги — это такие вещи, как VoIP, широкополосная связь, FTTC, Ethernet, Заказы маршрутизаторов и т. Д. И т. Д.-Не так много общего, и очень разные типы данных и поведения.
Базовый класс обслуживания имеет абстрактный метод, GetView
который возвращает тип C#, который является типом компонента Razor. Помните, что в Blazor все эти компоненты являются просто классами C#. Возвращаемый тип является компонентом Razor в той же библиотеке (поэтому у нас есть пользовательский интерфейс, а также инкапсуляция бизнес-логики и логики сущностей).
Родительский сайт загружает определенный тип службы, вызывает GetView
и привязывает службу к результирующему компоненту.
Существует также демонстрационный сайт по адресу https://blazordynamiclist.azurewebsites.net/
Я не буду здесь подробно объяснять все это, но это следует аналогичному подходу. Существует абстрактный базовый класс ProductBase
, у которого есть абстрактный метод GetViewComponent
. Каждый продукт может вернуть свой предпочтительный компонент бритвы для отображения.
«Волшебство» — это DynamicComponent.cs, который является компонентом Razor с BuildRenderTree
методом, который создает связанный экземпляр представления компонентов продукта.