• Blazor实战——Known框架多表增删改查


    多表增删改查示例

    本章介绍学习多张表增、删、改、查功能如何实现,下面以销货出库单作为示例,该业务栏位如下:

    销货出库单栏位

    • 销货单号、销货日期、状态、客户、备注

    销货出库单明细栏位

    • 商品编码、商品名称、规格型号、数量、单位、单价、金额

    该示例适用于出货明细数量较小情况,单据表头和表体组合查询和提交。

    对于出货明细数量较大的情况,建议表头与表体分开查询和提交,表体采用分页查询。

    1. 前后端共用

    1.1. 创建实体类

    • 在KIMS项目Entities文件夹下创建KmBill和KmBillList实体类
    • 该类继承EntityBase类
    • 属性使用Column特性描述,用于生成页面字段和数据校验
    //销货出库单
    public class KmBill : EntityBase
    {
    [Column("销货单号", "", true, "1", "50")]
    public string? BillNo { get; set; }
    ......
    [Column("客户", "", true, "1", "50")]
    public string? BillDate { get; set; }
    [Column("备注", "", false)]
    public string? Note { get; set; }
    //出货明细,为了降低代码量,扩展实体类,不再创建DTO类
    //此处使用虚属性,ORM映射SQL时忽略该属性
    public virtual List? Lists { get; set; }
    }
    //销货出库单明细
    public class KmBillList : EntityBase
    {
    [Column("销货单ID", "", true, "1", "50")]
    public string? HeadId { get; set; }
    [Column("商品编码", "", true, "1", "50")]
    public string? Code { get; set; }
    [Column("数量", "", false)]
    public decimal? Qty { get; set; }
    [Column("单价", "", false)]
    public decimal? Price { get; set; }
    [Column("金额", "", false)]
    public decimal? Amount { get; set; }
    //如下虚属性用于关联商品资料表查询显示
    public virtual string? Name { get; set; } //商品名称
    public virtual string? Model { get; set; } //规格型号
    public virtual string? Unit { get; set; } //计量单位
    }

    1.2. 创建Client类

    • 在KIMS项目Clients文件夹下创建BillClient类
    • 该类是前后端数据交互接口,继承ClientBase类
    • 该类只需提供分页查询、删除和保存,导入功能由框架统一异步处理
    public class BillClient : ClientBase
    {
    public BillClient(Context context) : base(context) { }
    public Task> QueryBillsAsync(PagingCriteria criteria) => Context.QueryAsync("Bill/QueryBills", criteria);
    public Task DeleteBillsAsync(List models) => Context.PostAsync("Bill/DeleteBills", models);
    public Task GetBillAsync(string id) => Context.GetAsync($"Bill/GetBill?id={id}");
    public Task SaveBillAsync(KmBill model) => Context.PostAsync("Bill/SaveBill", model);
    }

    2. 前端

    2.1. 创建List页面

    • 在KIMS.Razor项目BillData文件夹下创建BillList类
    • 该类是数据列表页面,继承WebGridView
    • 列表页面按钮和栏位在框架模块管理中配置
    class BillList : WebGridView<KmBill, BillForm>
    {
    protected override Task InitPageAsync()
    {
    //表格栏位格式化显示
    //销货单号链接,点击显示销货单查看表单
    Column(c => c.BillNo).Template((b, r) => b.Link(r.BillNo, Callback(() => View(r))));
    Column(c => c.Status).Template(BillStatusCell);//显示状态标签
    return base.InitPageAsync();
    }
    //分页查询
    protected override Task> OnQueryData(PagingCriteria criteria)
    {
    return Client.Bill.QueryBillsAsync(criteria);
    }
    public void New() => ShowForm();//新增按钮方法
    public void DeleteM() => DeleteRows(Client.Bill.DeleteBillsAsync);//批量删除按钮方法
    public void Edit(KmBill row) => ShowForm(row);//编辑操作方法
    public void Delete(KmBill row) => DeleteRow(row, Client.Bill.DeleteBillsAsync);//删除操作方法
    }

    2.2. 创建Form页面

    • 在KIMS.Razor项目BillData\Forms文件夹下创建BillForm类
    • 该类是数据编辑和查看明细页面,继承WebForm
    [Dialog(980, 580)]//设置对话框大小
    class BillForm : WebForm<KmBill>
    {
    private KmBill? head;
    //初始化表单,查询表头表体组合数据
    protected override async Task InitFormAsync()
    {
    var model = TModel;
    head = await Client.Bill.GetBillAsync(model.Id);
    }
    //表单布局
    protected override void BuildFields(FieldBuilder builder)
    {
    builder.Hidden(f => f.Id);//隐藏字段
    builder.Table(table =>
    {
    table.ColGroup(11, 25, 11, 25, 11, 17);
    table.Tr(attr =>
    {
    //销货单号不可编辑,自动生成编号
    table.Field(f => f.BillNo).Enabled(false).Build();
    table.Field(f => f.BillDate).Build();
    table.Field(f => f.Status).Enabled(false).Build();
    });
    table.Tr(attr => table.Field