表单项组功能允许您将相关的表单字段组织成逻辑组,提供更好的用户体验和表单结构。本功能基于 AMIS 的 Group 组件实现,支持不同显示模式、间距控制、条件显示等丰富的配置选项。

用于在 DTO 类型上定义表单项组的特性类,支持在类或属性上使用,允许多重定义。
负责创建表单项组的 AMIS 配置的工厂类,已自动注册到 DI 容器中。该工厂实现了 IAmisFieldFactory 接口,专门处理 FormGroupAttribute 特性。
内部类,用于将 FormGroupAttribute 包装成 ICustomAttributeProvider 接口,便于统一处理。
FormFieldHelper 已增强支持表单项组处理:
GetAmisFormFieldsFromProperties(properties, dtoType): 生成带表单项组的字段配置ProcessFormGroups(properties, dtoType): 专门用于处理表单项组的内部方法ProcessParametersWithGroups(parameters, dtoType): 处理方法参数的表单项组[FormGroup("basic", "基本信息", "Name,Email,Phone")]
[FormGroup("address", "地址信息", "Province,City,Address")]
publicclassUserFormDto
{
[DisplayName("姓名")]
[Required]
publicstring Name { get; set; }
[DisplayName("邮箱")]
[EmailAddress]
publicstring Email { get; set; }
[DisplayName("电话")]
publicstring Phone { get; set; }
[DisplayName("省份")]
publicstring Province { get; set; }
[DisplayName("城市")]
publicstring City { get; set; }
[DisplayName("详细地址")]
publicstring Address { get; set; }
}[FormGroup("basic", "基本信息", "Name,Email",
Order = 1,
Mode = FormGroupMode.Horizontal,
Gap = FormGroupGap.Large,
ShowBorder = true)]
[FormGroup("optional", "可选信息", "Phone,Remark",
Order = 2,
Hidden = false,
VisibleOn = "${showOptional}")]
public class AdvancedFormDto
{
// 属性定义...
}[FormGroup("custom", "自定义组", "Field1,Field2",
ClassName = "my-custom-group",
AdditionalConfig = "{\"style\":{\"backgroundColor\":\"#f5f5f5\"}}")]
public class CustomFormDto
{
// 属性定义...
}以下是基于 CodeSpirit.ApprovalApi 项目中的 FormDesignDto 的实际使用示例:
/// <summary>
/// 表单设计DTO - 展示表单项组的实际应用
/// </summary>
[AiFormFill(
TriggerField = nameof(BusinessScenario),
UseIndependentLLM = true,
MaxTokens = 3000,
EnableCache = true,
CacheExpirationMinutes = 30,
GlobalFillPrompt = "根据选定的工作流和业务场景,智能设计符合AMIS规范的审批表单结构"
)]
[FormGroup("workflow", "工作流信息", "Name,Code,Description", Order = 1)]
[FormGroup("requirements", "需求描述", "BusinessScenario,RequiredFields,OptionalFields,SpecialFeatures", Order = 2)]
[FormGroup("formSchema", "表单设计", "FormSchema,FormSchemaReview", Order = 3, Direction = FormGroupDirection.Vertical)]
publicclassFormDesignDto
{
/// <summary>
/// 工作流名称(只读,用于显示)
/// </summary>
[DisplayName("工作流名称")]
[AmisFormField(Type = "static", VisibleOn = "${id}", ColumnRatio = 6)]
publicstring? Name { get; set; }
/// <summary>
/// 工作流代码(只读,用于显示)
/// </summary>
[DisplayName("工作流代码")]
[AmisFormField(Type = "static", VisibleOn = "${id}", ColumnRatio = 6)]
publicstring? Code { get; set; }
/// <summary>
/// 工作流描述(只读,用于显示)
/// </summary>
[DisplayName("工作流描述")]
[AmisFormField(Type = "static", VisibleOn = "${id}", ColumnRatio = 12)]
publicstring? Description { get; set; }
/// <summary>
/// 业务场景描述
/// </summary>
[Required]
[StringLength(500, ErrorMessage = "业务场景描述长度不能超过500个字符")]
[DisplayName("业务场景描述")]
[Description("详细描述表单的业务场景和用途")]
[AiFieldFill(Weight = 4, Priority = 1)]
[AmisInputTextField(Placeholder = "请详细描述表单的业务场景和用途", ColumnRatio = 12)]
publicstring BusinessScenario { get; set; } = string.Empty;
/// <summary>
/// 必需字段要求
/// </summary>
[StringLength(1000)]
[DisplayName("必需字段要求")]
[Description("描述表单中必须包含的字段和信息")]
[AiFieldFill(Weight = 3, Priority = 2)]
[AmisTextareaField(Placeholder = "请描述表单必须包含的字段信息", ColumnRatio = 6)]
publicstring? RequiredFields { get; set; }
/// <summary>
/// 可选字段要求
/// </summary>
[StringLength(1000)]
[DisplayName("可选字段要求")]
[Description("描述表单中可选的字段和信息")]
[AiFieldFill(Weight = 2, Priority = 3)]
[AmisTextareaField(Placeholder = "请描述表单可选的字段信息", ColumnRatio = 6)]
publicstring? OptionalFields { get; set; }
/// <summary>
/// 特殊功能需求
/// </summary>
[StringLength(1000)]
[DisplayName("特殊功能需求")]
[Description("表单的特殊功能需求")]
[AiFieldFill(Weight = 2, Priority = 6)]
[AmisTextareaField(Placeholder = "请描述表单需要的特殊功能", ColumnRatio = 12)]
publicstring? SpecialFeatures { get; set; }
/// <summary>
/// 生成的表单Schema
/// </summary>
[DisplayName("表单定义")]
[Description("AI生成的符合AMIS规范的审批表单JSON结构")]
[AiFieldFill(Weight = 5, Priority = 7)]
[AmisFormField(Type = "editor", AdditionalConfig = "{\"language\":\"json\"}", ColumnRatio = 6)]
publicstring? FormSchema { get; set; }
/// <summary>
/// 表单预览
/// </summary>
[DisplayName("")]
[AmisFormField(Type = "amis", AdditionalConfig = "{\"name\":\"formSchema\"}", ColumnRatio = 6)]
publicstring? FormSchemaReview { get; set; }
}效果如图所示:

workflow): 包含只读的工作流基本信息,Order = 1 确保最先显示requirements): 包含用户输入的需求信息,Order = 2 排在第二位formSchema): 包含生成的表单定义和预览,Order = 3 排在最后,使用垂直方向布局这个示例展示了如何在复杂的业务场景中使用表单项组来组织表单结构,提供清晰的用户界面。
Order 属性设置组的显示顺序,重要信息优先显示Fields 属性中的字段名称与 DTO 属性名称完全匹配Gap 属性控制组内字段的间距,提供舒适的视觉体验VisibleOn 和 DisabledOn 实现动态的表单交互Direction(垂直或水平)基于 FormDesignDto 的实践经验:
Fields 属性中的字段名称必须与 DTO 属性名称完全匹配(不区分大小写)Order 属性排序,未分组的字段显示在最后FormGroupAttribute 必须应用在类上,不能应用在属性上Fields 属性中的字段名称是否与属性名称完全匹配[JsonIgnore] 或类似的忽略特性Hidden 属性是否设置为 trueVisibleOn 条件表达式是否正确Order 属性的设置,数值越小越靠前Order 值AdditionalConfig 中的 JSON 格式是否正确ClassName 是否包含有效的 CSS 类名Direction 和 Mode 的组合是否合理Gap 设置是否适当ColumnRatio 设置是否正确// 检查类型是否定义了表单项组
var hasGroups = typeof(FormDesignDto).HasFormGroups();
Console.WriteLine($"Has form groups: {hasGroups}");
// 获取所有表单项组
var groups = typeof(FormDesignDto).GetFormGroups();
foreach (var group in groups)
{
Console.WriteLine($"Group: {group.Name}, Title: {group.Title}, Fields: {group.Fields}");
}var properties = typeof(FormDesignDto).GetProperties();
foreach (var property in properties)
{
var belongsToGroup = property.BelongsToFormGroup(typeof(FormDesignDto));
var group = property.GetBelongingFormGroup(typeof(FormDesignDto));
Console.WriteLine($"Property: {property.Name}, Belongs to group: {belongsToGroup}, Group: {group?.Name}");
}// 获取生成的配置
var properties = typeof(FormDesignDto).GetProperties();
var fieldsWithGroups = formFieldHelper.GetAmisFormFieldsFromProperties(properties, typeof(FormDesignDto));
// 输出配置用于调试
foreach (var field in fieldsWithGroups)
{
Console.WriteLine($"Field Type: {field["type"]}, Name: {field["name"]}, Label: {field["label"]}");
if (field["body"] != null)
{
Console.WriteLine($"Group Body: {field["body"]}");
}
}// 验证 AdditionalConfig 的 JSON 格式
var group = typeof(FormDesignDto).GetFormGroups().FirstOrDefault();
if (!string.IsNullOrEmpty(group?.AdditionalConfig))
{
try
{
var config = JObject.Parse(group.AdditionalConfig);
Console.WriteLine("JSON config is valid");
}
catch (Exception ex)
{
Console.WriteLine($"Invalid JSON config: {ex.Message}");
}
}FormGroupAttribute 特性类FormGroupFieldFactory 字段工厂FormGroupAttributeProvider 特性提供者FormFieldHelper 支持表单项组处理FormDesignDto 的实际项目应用