首页 > 美食

今日播报!小试Blazor——实现Ant Design Blazor动态表单

来源:博客园 时间:2023-06-25 07:30:26

前言

最近想了解下Blazor,于是尝试使用Blazor写一个简单的低代码框架,于是就采用了Ant Design Blazor作为组件库


(相关资料图)

低代码框架在表现层的第一步则是动态表单,需要将设计时的结构渲染成运行时的表单,本次主要实现动态表单,相关数据接口都以返回固定数据的形式实现

实现

1.项目准备

先通过命令创建一个Ant Design Blazor项目,并加入到空的解决方案当中:

dotnet new antdesign -o LowCode.Web -ho server

由于我们需要写一些API接口,所以在Startup类中加入控制器相关的代码:

public void ConfigureServices(IServiceCollection services)        {            services.AddRazorPages();            services.AddControllers();//添加控制器            services.AddEndpointsApiExplorer();            services.AddServerSideBlazor();            services.AddAntDesign();            services.AddScoped(sp => new HttpClient            {                BaseAddress = new Uri(sp.GetService().BaseUri)            });            services.Configure(Configuration.GetSection("ProSettings"));        }        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            else            {                app.UseExceptionHandler("/Error");                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.                app.UseHsts();            }            app.UseHttpsRedirection();            app.UseStaticFiles();                        app.UseRouting();                        app.UseEndpoints(endpoints =>            {                endpoints.MapBlazorHub();                endpoints.MapFallbackToPage("/_Host");                endpoints.MapControllers();//配置控制器            });        }

2.菜单接口

在项目中新增Services文件夹,添加MenuServices类并填入固定数据,并在Startup类中注册:

public class MenuService    {        ///         /// 获取左侧导航数据        ///         ///         public virtual MenuDataItem[] GetMenuData()        {            return new MenuDataItem[]            {                new MenuDataItem                {                    Path="/",                    Name="测试模块",                    Key="Test",                    Icon="smile",                    Children=new MenuDataItem[]                    {                        new MenuDataItem                        {                            Path="/StdForm",                            Name="动态表单",                            Key="Form",                            Icon="plus-square"                        }                    }                }            };        }    }

修改BaseicLayout.razor中@code部分,将_menuData改为从MenuService中获取:

private MenuDataItem[] _menuData ;    [Inject] public MenuService MenuService { get; set; }    protected override async Task OnInitializedAsync()    {        await base.OnInitializedAsync();        _menuData = MenuService.GetMenuData();    }

3.表单组件接口

创建一个简单的表单与组件的Model:

录入控件Input:

public class Input     {        public string Name { get; set; }        public string Value { get; set; }    }

标准表单StandardFormModel:

public class StandardFormModel    {        public StandardFormModel()        {            ArrayInput = new List();        }        public List ArrayInput { get; set; }    }

表单API接口FormController:

[Route("api/[controller]/[action]")]    [ApiController]    public class FormController : ControllerBase    {        [HttpGet]        public StandardFormModel GetFormStruc()        {            var result = new StandardFormModel();            result.ArrayInput.AddRange(new List(){                new Input()                {                    Name="账号"                },                new Input()                {                    Name="密码"                }            });            return result;        }    }

4.动态表单页面

在Pages文件夹下创建一个StdForm.razor和StdForm.razor.cs文件

StdForm.razor.cs(注意partial):

public partial class StdForm    {        public StandardFormModel StandardFormModel { get; set; }        public Form StdFormModel { get; set; }        [Inject]        public HttpClient HttpClient { get; set; }             public void Init()        {            var formStruc = HttpClient.GetFromJsonAsync("api/Form/GetFormStruc").Result;            StandardFormModel= formStruc;        }        protected override async Task OnInitializedAsync()        {            Init();            await base.OnInitializedAsync();                    }    }

StdForm.razor:

@page "/StdForm"
@foreach (var item in StandardFormModel.ArrayInput) { @if (item is Model.Component.Input) { } }

运行效果

总结

在Blazor项目中要访问API接口则需要注入HttpClient类,使用HttpClient请求API接口即可,也可以直接注入Services调用。

目前仅仅是验证了动态表单的可能性,其他的组件渲染可以根据Ant Design Blazor官方文档定义模型结构实现

参考文档:

Blazor官方文档

Ant Design Blazor官方文档

Ant Design Blazor仓库

相关稿件

今日播报!小试Blazor——实现Ant Design Blazor动态表单

大学奖学金申请理由(奖学金申请理由300 500) 热资讯

天天滚动:绿军送走斯玛特 帕金斯直呼不理解 杰弗森安慰:木已成舟了

薪资专家:湖人不会追欧文 他们专注于留住里夫斯和八村塁-每日播报

2023年4月别克GL8销量多少? 在美系车中排名怎么样?

斯玛特发文向波士顿告别:虽未拿到第18冠但无比骄傲

局地气温达40℃!中央气象台继续发布高温橙色预警

曝具俊晔回韩国,留大S独自面对风波,谁是真爱与汪小菲对比明显|天天微速讯

世界关注:3000左右的手机推荐(3000左右的手机推荐2019)

业务员工作总结报告(业务员工作总结) 世界热推荐

李想,在微博“造车”

“敬礼娃娃”郎铮637分!已收到北大、人大邀请-世界资讯

我的输入法是什么(我的输入法无法使用 怎么办)

显存不足会怎么样(显存不足)

将9月底实现量产 全新一代北京BJ40申报图

伊能静罕晒儿女同框照,哈利从美国放假回国|今日关注

全球聚焦:儋州考生 中考期间遇到突发状况怎么办?不慌!这里有应对大全

玩逆战游戏太卡什么原因(玩逆战不流畅怎么办)

后风窗玻璃刮水器及洗涤器图标(前风窗玻璃刮水器及洗涤器图标)|焦点报道

玩cf卡怎么办解决方法(玩cf卡怎么办)

巴基斯坦取消进口限制以满足国际货币基金组织要求_今日热文

【魅力竞演·叙州】三等奖作品展播

心悦俱乐部g分有什么用(心悦g分有什么用)-天天资讯

市场下行对于价值投资来说是好事还是坏事?_每日热讯

【环球时快讯】据俄罗斯卫星通讯社6月25日报道,俄罗斯总统普京已签署新法令,宣布9月3日为对日本军国主义战争胜利纪念日暨二战结束纪念日

环球微速讯:端午假期河南旅游接待1266.3万人次同比增长48.6%

突发!国泰航空一客机突发故障,11人逃生途中受伤送医!女乘客还原惊恐一幕:有人打电话给父母一直哭,有一个妈妈抱着孩子一直说对不起……

通讯!欧盟通过第11轮对俄制裁,俄外交部:制裁非法,已及时回应

天天观焦点:莘县开展“粽享和谐邻里情”活动

俄外长:俄白两国均未违反《不扩散核武器条约》 环球热门