# 表单提交时如何附加业务处理
# 概述
本功能用于在表单提交后执行额外的业务逻辑处理,例如收货单提交后更新订单状态等常见需求。
# 一、示例演示:物流收货模块
# 演示路径
- 访问地址:https://localhost:5001/app/samples
- 模块名称:附加处理 → 物流收货
操作步骤:
- 进入"附加处理"模块
- 点击"添加"按钮,填写收货单:
- 收货内容:任意填写
- 收货人:选择人员
- 收货时间:选择日期
- 收货明细:添加2行
- 第一行:物品: 11, 数量: 12, 单位: 13
- 第二行:物品: 21, 数量: 22, 单位: 23
- 点击"保存"提交表单
# 业务处理效果
表单提交成功后,在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特性指定映射关系
# 四、实际应用步骤
# 操作步骤
- 找到对应控制器:如
SampleGoodsReceiptController - 重写提交方法:
SubmitNewForm(新增)或SubmitForm(编辑) - 获取表单数据:使用
GetFormData<T>()方法 - 替换业务逻辑:将控制台输出代码替换为实际业务代码
# 关键要点
- 不必提取所有字段:只需提取业务处理需要的字段
- 保持框架流程:先调用
base.xxx执行基础保存 - 灵活扩展:可在多个提交点添加不同处理逻辑
# 五、实际应用场景
收货单提交后,可执行:
- 更新采购订单收货状态
- 增加库存数量
- 发送到货通知
- 记录操作日志
# 六、总结
表单提交后附加业务处理的实现非常便捷:
- 框架自动完成:基础的CRUD操作由框架自动处理
- 自定义灵活:只需在指定位置添加业务逻辑代码
- 数据易获取:通过强类型实体类轻松获取表单数据
- 扩展性强:支持复杂业务逻辑和异步操作
通过这种方式,可以在不破坏原有表单处理流程的前提下,灵活扩展业务功能,满足各种业务场景的需求。
← 存id显示名字 使用流程来进行提交后处理 →