小鸡爱大米 发表于 2023-6-25 00:16:35

小试Blazor——实现Ant Design Blazor动态表单

前言
最近想了解下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<NavigationManager>().BaseUri)
            });
            services.Configure<ProSettings>(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
    {
      /// <summary>
      /// 获取左侧导航数据
      /// </summary>
      /// <returns></returns>
      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 ;
    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<Input>();
      }
      public List<Input> ArrayInput { get; set; }
    }  
表单API接口FormController:
    /")]
   
    public class FormController : ControllerBase
    {

      
      public StandardFormModel GetFormStruc()
      {
            var result = new StandardFormModel();
            result.ArrayInput.AddRange(new List<Input>(){
                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<StandardFormModel> StdFormModel { get; set; }

      
      public HttpClient HttpClient { get; set; }<br>    
      public void Init()
      {
            var formStruc = HttpClient.GetFromJsonAsync<StandardFormModel>("api/Form/GetFormStruc").Result;
            StandardFormModel= formStruc;
      }

      protected override async Task OnInitializedAsync()
      {
            Init();
            await base.OnInitializedAsync();
            
      }
    }  
StdForm.razor:
@page "/StdForm"
<Form @ref="StdFormModel"
      Model="StandardFormModel"
    LabelColSpan="1"
    WrapperColSpan="6">

    @foreach (var item in StandardFormModel.ArrayInput)
    {
      <FormItem Label="@item.Name">

            @if (item is Model.Component.Input)
            {
                <Input @bind-Value="@item.Value"/>
            }

      </FormItem>
    }

</Form>  
运行效果

 
总结
在Blazor项目中要访问API接口则需要注入HttpClient类,使用HttpClient请求API接口即可,也可以直接注入Services调用。
目前仅仅是验证了动态表单的可能性,其他的组件渲染可以根据Ant Design Blazor官方文档定义模型结构实现
参考文档:
Blazor官方文档
Ant Design Blazor官方文档
Ant Design Blazor仓库

来源:https://www.cnblogs.com/invoker-Fv/archive/2023/06/24/17501775.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 小试Blazor——实现Ant Design Blazor动态表单