新增/编辑前处理数据
本文档介绍如何在数据新增或编辑前,使用 C# 脚本自定义处 理数据。
使用场景
当需要在数据新增或编辑前对数据进行预处理时,例如:
- 自动计算字段值(如:数值求和、日期差值等)
- 数据格式转换和标准化
- 设置默认值
- 数据关联处理
实现方式
数据结构说明
新增/编辑/删除等操作时,HTTP 请求的 RequestBody 内容会托管到 context.Request.List 属性中,可以在 List 属性中获取到前端请求数据。
示例代码
以下示例演示如何在新增/编辑前自动计算两个字段的和:
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Chameleon.Common;
using Chameleon.Common.Context;
using Chameleon.Common.Exceptions;
using Chameleon.Common.Models;
using Chameleon.Database;
using Chameleon.SDK;
public class ChameleonCSharpScript
{
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
foreach (var item in list)
{
item["numbersum"] = Convert.ToInt32(item["number1"]) + Convert.ToInt32(item["number2"]);
}
return null;
}
}
数据格式示例
新增/编辑时,context.Request.List 的数据格式如下:
{
"list": [
{
"Id": "69dcccb5-9228-4baf-ac38-4eebd0e15076",
"Fields": {
"_id": {
"Code": "_id",
"Value": "69dcccb5-9228-4baf-ac38-4eebd0e15076"
},
"number1": {
"Code": "number1",
"Value": 1
},
"number2": {
"Code": "number2",
"Value": 1
},
"date1": {
"Code": "date1",
"Value": "2024-12-31T16:00:00"
},
"date2": {
"Code": "date2",
"Value": "2025-01-21T16:00:00"
}
}
}
]
}
关键点说明
1. 数据访问方式
- 通过
context.Request.List获取数据列表 - 每个列表项是一个字典对象,可通过字段名直接 访问
- 字段值存储在
Fields集合中的Value属性
2. 数据修改
- 直接修改
item字典中的值即可 - 修改后的数据会传递给后续的数据操作流程
3. 返回值
- 返回
null表示正常继续执行 - 如需中断流程,可返回错误消息字符串
扩展示例
日期处理示例
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
foreach (var item in list)
{
// 计算日期间隔天数
if (item.ContainsKey("date1") && item.ContainsKey("date2"))
{
var date1 = Convert.ToDateTime(item["date1"]);
var date2 = Convert.ToDateTime(item["date2"]);
item["daysdiff"] = (date2 - date1).Days;
}
}
return null;
}
条件判断示例
public string Execute(ComponentContext context, ChameleonSDK sdk)
{
var list = context.Request.List;
foreach (var item in list)
{
// 根据金额自动设置等级
var amount = Convert.ToDecimal(item["amount"]);
if (amount >= 10000)
{
item["level"] = "高";
}
else if (amount >= 5000)
{
item["level"] = "中";
}
else
{
item["level"] = "低";
}
}
return null;
}
注意事项
- 类型转换:从字典中获取的值通常是 object 类型,需要进行适当的类型转换
- 空值检查:访问字段前建议检查字段是否存在,避免空引用异常
- 性能考虑:如果数据量较大,注意脚本的执行效率
- 数据验证:可以在脚本中进行数据验证,返回错误消息中断流程