# 表单提交时如何附加业务处理

# 概述

本功能用于在表单提交后执行额外的业务逻辑处理,例如收货单提交后更新订单状态等常见需求。

# 一、示例演示:物流收货模块

# 演示路径

  • 访问地址:https://localhost:5001/app/samples
  • 模块名称:附加处理 → 物流收货

操作步骤

  1. 进入"附加处理"模块
  2. 点击"添加"按钮,填写收货单:
    • 收货内容:任意填写
    • 收货人:选择人员
    • 收货时间:选择日期
    • 收货明细:添加2行
      • 第一行:物品: 11, 数量: 12, 单位: 13
      • 第二行:物品: 21, 数量: 22, 单位: 23
  3. 点击"保存"提交表单

# 业务处理效果

表单提交成功后,在WEB应用控制台会输出:

**************************************
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://[::]:5001
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://[::]:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\SetupDisk\CrossPlatform\Web
新增数据:
{
  "收货内容": "1",
  "收货人": "99199",
  "收货日期": "2025-12-10T00:00:00",
  "收货明细": [
    {
      "物品": "11",
      "数量": 12,
      "单位": "13"
    },
    {
      "物品": "21",
      "数量": 22,
      "单位": "23"
    }
  ]
}

这表明表单提交后执行了额外的业务处理代码。

# 二、实现方法

# 后台代码位置

文件路径Web项目\Apps\Controllers\SampleGoodsReceiptController.cs

# 新增表单提交处理

public override Task<IActionResult> SubmitNewForm(string formId, FormSubmitPayload payload)
{
    // 调用基类方法完成默认处理
    var rv = base.SubmitNewForm(formId, payload);

    // 解码表单数据
    var formData = payload.GetFormData<FormDataGoodsReceipt>();
    
    // 附加业务处理(示例:输出到控制台)
    Console.WriteLine("新增数据:");
    Console.WriteLine(JsonSerializer.Serialize(formData, new JsonSerializerOptions
    {
        WriteIndented = true,
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
    }));

    // 实际应用中可在此处添加业务逻辑代码
    // 例如:更新订单状态、修改库存等

    return rv;
}

# 编辑表单提交处理

public override Task<IActionResult> SubmitForm(string formId, string primaryKey, FormSubmitPayload payload)
{
    // 调用基类方法完成默认处理
    var rv = base.SubmitForm(formId, primaryKey, payload);

    // 解码表单数据
    var formData = payload.GetFormData<FormDataGoodsReceipt>();
    
    // 附加业务处理(示例:输出到控制台)
    Console.WriteLine("更新数据:");
    Console.WriteLine(JsonSerializer.Serialize(formData, new JsonSerializerOptions
    {
        WriteIndented = true,
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
    }));

    // 实际应用中可在此处添加业务逻辑代码

    return rv;
}

# 三、表单数据结构

# 表单数据实体类

public class FormDataGoodsReceipt
{
    [JsonPropertyName("收货内容")]
    public string Subject { get; set; }

    [JsonPropertyName("收货人")]
    public string Uid { get; set; }

    [JsonPropertyName("收货日期")]
    public DateTime ReceiptDate { get; set; }

    [JsonPropertyName("收货明细")]
    public List<FormDataGoodsReceiptDetail> Details { get; set; }
}

public class FormDataGoodsReceiptDetail
{
    [JsonPropertyName("物品")]
    public string Goods { get; set; }
    
    [JsonPropertyName("数量")]
    public decimal Quantity { get; set; }
    
    [JsonPropertyName("单位")]
    public string Unit { get; set; }
}

# 字段提取说明

  • 无需提取所有字段:根据业务需要,只提取需要的字段即可
  • 灵活定义:实体类中的字段应与表单字段对应,使用JsonPropertyName特性指定映射关系

# 四、实际应用步骤

# 操作步骤

  1. 找到对应控制器:如SampleGoodsReceiptController
  2. 重写提交方法SubmitNewForm(新增)或SubmitForm(编辑)
  3. 获取表单数据:使用GetFormData<T>()方法
  4. 替换业务逻辑:将控制台输出代码替换为实际业务代码

# 关键要点

  • 不必提取所有字段:只需提取业务处理需要的字段
  • 保持框架流程:先调用base.xxx执行基础保存
  • 灵活扩展:可在多个提交点添加不同处理逻辑

# 五、实际应用场景

收货单提交后,可执行:

  1. 更新采购订单收货状态
  2. 增加库存数量
  3. 发送到货通知
  4. 记录操作日志

# 六、总结

表单提交后附加业务处理的实现非常便捷:

  • 框架自动完成:基础的CRUD操作由框架自动处理
  • 自定义灵活:只需在指定位置添加业务逻辑代码
  • 数据易获取:通过强类型实体类轻松获取表单数据
  • 扩展性强:支持复杂业务逻辑和异步操作

通过这种方式,可以在不破坏原有表单处理流程的前提下,灵活扩展业务功能,满足各种业务场景的需求。