通用视图是对通用框架的再次简化,对于单表、一对多、多对多
三种模式利用通用框架生成的代码,当只是在UI上做一些调整,比如对Lv调整显示模式、列序、修改列宽列标题,对Fv表单重新定义xaml等,通用视图就是很好的选择,它不需要额外的代码,只需要为通用视图
定义好实体类型、Lv Fv的xaml、菜单项等,这些配置保存在json串提供给通用视图
即可,大大减少冗余代码量。
通用视图有两种用法:
- 菜单配置方式,视图参数为json格式的配置,零代码实现所有功能,业务逻辑在实体类和领域服务中实现
- 代码调用方式,相当于将json格式的视图参数用代码构造
以下针对三种模式演示通用视图的用法
通用单表视图
菜单配置
在菜单管理中添加新菜单项,参见添加菜单,视图名称选择通用单表视图
,然后编辑
视图参数
表单的校验在实体类
的InitHook中实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| protected override void InitHook()
{
OnSaving(async () =>
{
if (IsAdded && 发布插入事件)
{
AddEvent(new 插入Event { ID = ID });
}
if (c不重复.IsChanged)
{
int cnt = await AtSvc.GetScalar<int>($"select count(1) from crud_基础 where 不重复='{不重复}' and ID!={ID}");
if (cnt > 0)
{
Throw.Msg("[不重复]列存在重复值!", c不重复);
}
}
if (禁止保存)
{
Throw.Msg("已选中[禁止保存],保存前校验不通过!", c禁止保存);
}
if (c值变事件.IsChanged)
{
AddEvent(new 值变Event
{
OriginalVal = _cells["值变事件"].GetOriginalVal<string>(),
NewVal = 值变事件,
});
}
});
OnDeleting(() =>
{
if (禁止删除)
{
Throw.Msg("已选中[禁止删除],删除前校验不通过!");
}
if (发布删除事件)
{
AddEvent(new 删除Event { Tgt = this });
}
return Task.CompletedTask;
});
OnChanging(c限长4, e =>
{
e.NewVal = e.Str.ToUpper();
// 内部已有默认的超长校验,按照数据库字段长度
Throw.If(e.GbkLength > 8, "超出最大长度", e.Cell);
Throw.If(e.Str.Length > 8, "超出最大长度", e.Cell);
Throw.If(e.Utf8Length > 8, "超出最大长度", e.Cell);
Throw.If(e.UnicodeLength > 8, "超出最大长度", e.Cell);
});
OnChanging(c禁止选中, e =>
{
Throw.If(e.Bool, "[禁止选中]列无法选中");
});
}
|
代码调用
实体视图的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| public class EntityCfg
{
/// <summary>
/// 实体类全名,包括程序集名称
/// </summary>
public string Cls { get; set; }
/// <summary>
/// 查询面板的xaml
/// </summary>
public string QueryFvXaml { get; set; }
/// <summary>
/// 列表配置
/// </summary>
public EntityListCfg ListCfg { get; set; }
/// <summary>
/// 表单配置
/// </summary>
public EntityFormCfg FormCfg { get; set; }
/// <summary>
/// 一对多时子实体的父表主键字段名
/// </summary>
public string ParentID { get; set; }
/// <summary>
/// 是否一对多的子表
/// </summary>
public bool IsChild { get; set; }
}
|
内含Lv Menu的Tab,名称为List,其配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public class EntityListCfg
{
/// <summary>
/// Lv的XAML
/// </summary>
public string Xaml { get; set; }
/// <summary>
/// Tab标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 是否显示添加菜单
/// </summary>
public bool ShowAddMi { get; set; } = true;
/// <summary>
/// 是否显示删除菜单
/// </summary>
public bool ShowDelMi { get; set; } = true;
/// <summary>
/// 是否显示多选菜单
/// </summary>
public bool ShowMultiSelMi { get; set; } = true;
}
|
内含Fv Menu的Tab,名称为Form,其配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public class EntityFormCfg
{
/// <summary>
/// 表单的XAML
/// </summary>
public string Xaml { get; set; }
/// <summary>
/// Tab标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 是否显示添加菜单
/// </summary>
public bool ShowAddMi { get; set; } = true;
/// <summary>
/// 是否显示保存菜单
/// </summary>
public bool ShowSaveMi { get; set; } = true;
/// <summary>
/// 是否显示删除菜单
/// </summary>
public bool ShowDelMi { get; set; } = true;
}
|
打开通用单表视图窗口
1
| GenericView.OpenSingleTbl(new EntityCfg { Cls = "Demo.Base.基础X,Demo.Base" });
|
通用一对多视图
菜单配置
在菜单管理中添加新菜单项,视图名称选择通用一对多视图
,然后编辑
视图参数
代码调用
打开通用一对多视图窗口
1
2
3
4
5
6
7
| OneToManyCfg cfg = new OneToManyCfg();
cfg.IsUnionForm = true;
cfg.ParentCfg = new EntityCfg { Cls = "Demo.Base.父表X,Demo.Base" };
cfg.ChildCfgs.Add(new EntityCfg { Cls = "Demo.Base.大儿X,Demo.Base", ParentID = "parent_id", IsChild = true });
cfg.ChildCfgs.Add(new EntityCfg { Cls = "Demo.Base.小儿X,Demo.Base", ParentID = "group_id", IsChild = true });
GenericView.OpenOneToMany(cfg);
|
通用多对多视图
菜单配置
在菜单管理中添加新菜单项,视图名称选择通用多对多视图
,然后编辑
视图参数
代码调用
打开通用多对多视图窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| var cfg = new ManyToManyCfg();
cfg.MainCfg = new EntityCfg { Cls = "Demo.Base.角色X,Demo.Base" };
cfg.RelatedCfgs.Add(
new RelatedEntityCfg
{
RelatedCls = "Demo.Base.用户X,Demo.Base",
MiddleCls = "Demo.Base.用户角色X,Demo.Base",
MainFk = "role_id",
RelatedFk = "user_id"
});
cfg.RelatedCfgs.Add(
new RelatedEntityCfg
{
RelatedCls = "Demo.Base.权限X,Demo.Base",
MiddleCls = "Demo.Base.角色权限X,Demo.Base",
MainFk = "role_id",
RelatedFk = "prv_id"
});
GenericView.OpenManyToMany(cfg)
|