排序,这个是表单字段排序

排序遵循一个原则,从小到达,默认为0,0的保持字段排序规则!
特别是有继承的时候,你只要把需要在前面的配置为负数,在后面的配置为正数即可!

sort

表示排序,表示字段的顺序,一般表格比较会使用这个

字段 类型 示例 说明
args1 数字 0 默认为0
args2 字符 备用 备用
args3 字符 备用 备用
args4 字符 备用 备用
        /// <summary>
        /// outer outers object objects
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("/api/app/obj/readAddModel")]
        public VoloModelInfo ReadAddModel4()
        {
            var _model = PasteBuilderHelper.ReadModelProperty<ObjectDto>(new ObjectDto());

            ////排序 自行处理
            //_model.Properties.Sort((p1,p2)=>p1.Sort.CompareTo(p2.Sort));
            ////排序自行处理
            //_model.Properties = _model.Properties.OrderBy(x => x.Sort).ThenBy(x => x.Name).ToList();

            return _model;
        }

排序,这个是用于表格的排序

orderby

表示基于哪个字段进行排序,这个一般是ListDto表示表格中,可以基于哪个字段进行排序查询

字段 类型 示例 说明
args1 字符 id 升序用哪个字段
args2 字符 id desc 降序用哪个字段
args3 字符 备用 备用
args4 字符 备用 备用

args1和args2可以不填,表示直接使用当前字段的名称作为升序降序,比如

        /// <summary>
        /// ID
        /// </summary>
        [ColumnDataType("orderby", "Id", "Id desc")]
        public int Id { get; set; }

        ///<summary>
        ///名称
        ///</summary>
        [PasteClass]
        [ColumnDataType("html", "<div class=\"level level{{:=item.level}} role{{:=item.roleTypeInt}}\">{{ if(item.icon){ }}<i class=\"Hui-iconfont {{:=item.icon}}\"></i>{{ } }} {{:=item.name}}</div>")]
        public string Name { get; set; }

        ///<summary>
        ///模块 升序为Model,降序为Model desc
        ///</summary>
        [PasteClass]
        [PasteOrderby]
        public string Model { get; set; }

这样的修改后,表格中就有上下箭头,点击后会重新按照排序查询数据!
图片alt
所以这个特性是用于listdto的字段的!

这个特性很重要!
就是表格支持编辑模式
目前支持select number string switch等

args1-args4可以都使用,表示当前模式,目前的模式有view,select,bind,这几个不分顺序,表示在这个模式下则为编辑模式!
这个特性是标注在listdto的字段中的

字段 类型 示例 说明
args1 str view 表示当前view模式的时候显示编辑
args2 str select
args3 str bind
args4 str xxx 预留

其实上面几个view select bind 可以随便改位置,
如果你使用[PasteEdit]的话,默认是view模式!

由于这个的引入,就引发了一个新的问题!

图片alt

注意看上图,一般情况下每一行的时间类型是一致的,不过有时候有特殊需求,要不一样,咋办?

看上图就是不一样的,也就是可以实现的!

        /// <summary>
        /// 时间类型
        /// </summary>
        [ColumnDataType("select", "[{\"name\":\"日类型\",\"value\":0},{\"name\":\"月类型\",\"value\":1},{\"name\":\"年类型\",\"value\":2}]")]
        [ColumnDataType("edit","view")]
        public int DateType { get; set; }

        /// <summary>
        /// 给DateType编辑的时候使用,记得要赋值
        /// </summary>
        [PasteHidden]
        public List<SelectIntItem> DateType_expend_select_values { get; set; }

注意看他的扩展_expend_select_values这个名称是固定的,至于类型SelectIntItem这个其实就是DateType的select的值的类型,然后在获取页面数据的时候对他赋值

        /// <summary>
        /// 获取
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<PagedResultDto<TestTableListDto>> Page([FromQuery] InputSearchBase input)
        {
            var _query = _dbContext.TestTable.Where(t => 1 == 1);
            var _pagedto = new PagedResultDto<TestTableListDto>();
            if (input.page == 1)
            {
                _pagedto.TotalCount = await _query.CountAsync();
            }
            var dataList = await _query
                .OrderByDescending(x => x.Id)
                .Page(input.page, input.size)
                .AsNoTracking()
                .ToListAsync();
            if (dataList == null || dataList.Count == 0)
            {
                throw new PasteCodeException("没有查询到数据", 204);
            }
            var temList = ObjectMapper.Map<List<TestTable>, List<TestTableListDto>>(dataList);
            //注意这一行代码,我是给ID为1的做不一样的测试数据用
            var find1 = temList.Where(x => x.Id == 1).FirstOrDefault();
            if (find1 != null && find1 != default)
            {
                find1.DateType_expend_select_values = new List<SelectIntItem>() { new SelectIntItem { name = "111", value = 0 }, new SelectIntItem { name = "222", value = 1 }, new SelectIntItem { name = "333", value = 2 } };
            }
            _pagedto.Items = temList;
            return _pagedto;
        }

我们来看下UI中是如何生效的
图片alt
我这里使用了双重模板,就是二重渲染,第一重渲染规则,第二重渲染数据
{{和}}会在一重渲染后替换成<%和%>

这就涉及到另外一个问题要注意了!
比如之前的

        /// <summary>
        /// 类型显示
        /// </summary>
        [ColumnDataType("html", "<div class=\"dtype{{:=item.dateTypeInt}}\">{{:=item.dateType}}-{{:=item.dateType}}</div>")]
        public int DateTypeInt { get { return DateType; } }

select我们知道有2个东西,一个是名称,一个是值,暂时这么称呼,比如value==1叫日类型

如果是非edit模式下,上面的显示是显示DateType对应的string的名称(string),也就是显示名称而不是值(int)
而如果在edit模式下,上面就是显示的是值(int)而不是名称(string)

所以,如果你要显示对应的名称而不是值的话,你可以再复制一个datetype出来,然后隐藏他
最后datetypeint这里得html修改下即可!

至于一行数据修改后,如何获得??? 注意这个用到了选中的这个概念

你可以调用函数

图片alt

如果返回的数据类型不太对劲,后续估计我还要改下代码,引入valueType
比如select的字段,他的显示是select,但是值的类型目前用的多的就是number/string

bool类型的,在表单中默认为switch显示!
如果在list表格中,则要手动标记!

switch

用于表格中显示switch,否则显示true/false

字段 类型 示例 说明
args1 字符 view 当model==args1的时候才生效,如果全部要生效则标记为空
args2 字符 handlerStatus 表示要执行的函数名称,注意只有一个参数elc,参考handlerSwitchChange
/**
 * 表格中的switch的开关触发
 * @param {*} elc 
 */
function handlerSwitchChange(elc, func_name) {
    // dataid dataname

    if (func_name && func_name != "undefined") {
        const func_direct = window[func_name];
        if (typeof func_direct == 'function') {
            func_direct(elc);
        }
    } else {

        var _dataid = $(elc).attr('dataid');// 1或者guid等主键
        var _dataname = $(elc).attr('dataname');//isEnable
        var _value = $(elc).prop('checked');//true/false
        var _info = {
            id: _dataid,
            name: _dataname,
            state: _value,
            search: location.search
        };
        //由后端基于这个参数自己决定如何处理
        _apipost(`${auto_path()}/updateState`, true, JSON.stringify(_info), (c, o) => {
            if (c != 200) {
                $(elc).prop('checked', !_value);
            }
        });
        //上面的接口需要服务端对应实现
    }
}

args2的作用其实是什么呢!
默认你直接点击switch就请求api
有些情况下,可能会先对话框问你,确定要修改这个状态么
这个时候就是args2出场了!

用于给当前页面加载lib用,比如要载入js css等,这个特性是给class标记的,表单和table都可以生效

字段 类型 示例 说明
args1 字符 ../lib/pro.js 表示载入当前上一个文件夹的lib下的pro.js文件,也可以载入css要看尾巴!
args2 字符 func_name 如果是js结尾的,这个可以填写,表示载入后要执行的哪个函数,注意这个函数没有参数

这个好玩!
用于字段是其他对象的时候,可以这么理解,比如你订单信息中包含了商品信息(不是一个ID字段,是一个对象)
这个特性目前没有其他东西,也就是无参!!!
比如适用于以下案例

[PasteDirectsun]
public UserAddress Address {get;set;}

也适用于

[PasteDirectsun]
public ICollection<UserSign> Signs {get;set;}

规定,如果是一个集合,比如上面的ICollection或者List<T>或者T[]等
如果当前没有配置group特性,则会自动生成一个group
这样做的目前有
1.便于UI中直接通过点击组别的+创建一个默认的对象
2.在编辑的时候,便于通过点击-删除一个对象

注意事宜
如果使用directsun的,反射的时候使用的是
DynamicReadModelProperty
而不是
PasteBuilderHelper.ReadModelProperty
返回的字段信息中,多层级对象的会以_分割,所以你的字段不要开头,也不要出现连续的两个_
这样会和规则冲突!!!

标记表单提交成功后的后续动作。特殊场景下使用,比如新增后刷新父级页面(父级页面刷新了,当前页面也会自动关闭)。

字段 类型 示例 说明
args1 字符 parent 哪个页面,可选值 parent / current
args2 字符 reload 执行动作,可选值 href / close / replace / open / reload
args3 字符 /xxx?id={{id}} 如果是跳转,则表示 url,可以使用 {{id}} 表示带入当前返回值
args4 字符 留空 备用

配置菜单(A 标签模式)或者是条件菜单。

字段 类型 示例 说明
args1 字符 重置 名称
args2 字符 global_store_reset_state({{:=item.id}}) 执行某一个函数
args3 字符 Hui-iconfont-xiangpicha 启用的图标,其实就是 class
args4 字符 true 是否放置于按钮盒子中

还支持 btnCode 参数用于按钮权限。


注意:PasteTap 已过期(Obsolete),建议改用菜单相关特性(PasteMenu / PasteTdMenu)。

HTML 模式的菜单,直接用当前字段的值,为空或者有效值。
支持传入 btnCode 控制按钮权限。

基于表达式的条件按钮,也是配置菜单的一种。

字段 类型 示例 说明
args1 字符 item.isReady && item.stype==1 表达式
args2 字符 <a ...>重置状态</a> 满足条件时插入的 html
args3 字符 true 是否在按钮盒子中
args4 字符 留空 备用

还支持 btnCode 参数用于按钮权限。

游标分页。如果是非 page.size 分页的,那就是游标分页,用这个标记,就会在请求的时候返回 nextkey 获取下一页数据。
仅支持表格页面的搜索项的字段特性。

字段 类型 示例 说明
args1 字符 next_key 返回的字段,默认就是当前;查询后的数据默认格式为 next_key 表示下一页游标,items 表示数据

页面配置,修改页面的 config 配置。前端页面默认是支持 query 模式的,query 模式侧重前端控制,这个侧重后端控制。

字段 类型 示例 说明
args1 字符 {“drag_order_column”:true} 传入的是配置的 json 字符串
args2 字符 留空 预留:key
args3 字符 留空 备用:val
args4 字符 留空 备用:datatype

以 iframe 的模式编辑子内容,最后会以 object 的形式放回当前字段中。
页面需要实现对应函数 window.funcSubmitForm,可以参考 sku 板块的案例。

字段 类型 示例 说明
args1 字符 ./view.html?path=xxx&model=sunobj 外表名称/路径,支持 {{:=item.id}} 动态传参
args2 数字 300 高度,默认为 300
args3 字符 留空 css 的样式名称
args4 字符 留空 备用

重载单项,这个特殊情况下才使用,需要注意服务端要返回单个表单的对象。
比如你选择某一个类,你可以在服务端读取对应信息,返回到某一个表单项中。

字段 类型 示例 说明
args1 字符 /api/app/xxx/yyy?id={{:=item.xxx}} 重新载入项的 API 地址

创建对象。可以理解成扩展信息,有自己的表单信息。
比如新增用户的时候,你要给他一个配置表信息,则用这个会输入配置的 object 信息。

字段 类型 示例 说明
args1 字符 serviceInfo 外表名称
args2 字符 留空 这个留空
args3 字符 id 回传的列名,示例 id
args4 字符 name 显示的列名,示例 name

创建对象的多选模式,是 PasteObject 的复数版本,表示返回多个。

字段 类型 示例 说明
args1 字符 serviceInfo 外表名称
args2 字符 留空 这个留空
args3 字符 id 回传的列名,此 ID 比较特殊,支持 + 拼接(多字段排重)
args4 字符 name 显示的列名,支持 + 拼接

模板标注,标注使用哪个模板,用于 ListDto。
有些页面你要个性化,就可以使用这个引入外部的模板,注意要先使用 PasteLoadlib 引入 html(模板页面)。
然后这里标注用哪个 id 的模板,这样你可以一个项目设定一个模板页面复用就行了。

字段 类型 示例 说明
args1 字符 template_table_head 表格头部的模板 ID
args2 字符 template_table_body 表格内容的模板 ID

链接参数,作用于 ListDto,表示哪些参数会传递给表单。
比如 user_id,打开表格页面,用于要新增的时候,会把这个 user_id 传递给打开的页面。
然后你在对应的 AddDto 中引入 PasteQuery 就可以表示给表单默认填充了,所以一般和 PasteQuery 结合使用。

字段 类型 示例 说明
args1 字符 user_id 参数名称,多个之间使用 , 隔开
args2 字符 留空 备用
args3 字符 留空 备用
args4 字符 留空 备用

读取参数。从页面的 querystring 中读取数据,可以用于表格页面的搜索区域和表单,注意表单只作用于新建。

字段 类型 示例 说明
args1 字符 id 某一个参数,比如 id
args2 字符 hide 获取数据后,如果留空表示不隐藏,不留空表示隐藏,建议填写 hide
args3 字符 留空 备用
args4 字符 留空 备用

服务端特性,为字段扩展外表,需要标注在外表 Key 上,比如 UserId。

字段 类型 示例 说明
args1 字符 UserInfo 表名,作为 _dbContext 的对象
args2 字符 ExtendUser 某一个字段,外键值字段
args3 字符 ToUserShort() 扩展表达式

服务端特性,为当前 Model 创建一个 ShortModel。
按照规则名称自动生成,Info 会被替换为空,默认主键 Id,默认显示 Name。

服务端特性,标记于 Entity 用于标记权限。PasteDisable 是 UI,这个也标记于 ListDto,注意要转化为 disable。
当前是总开关,表示所有的动作(包括 root),比如 del false 表示 root 也没有删除权限。

字段 类型 示例 说明
args1 字符 * 哪些动作,示例 */add,list 等,多个之间使用 , 隔开
args2 布尔 true 是否有权限

服务端特性,类似 PasteLink,这里表示 Include 表,标记于 Entity 中。

字段 类型 示例 说明
args1 字符 UserInfo 表名
args2 字符 Id 关联的键

服务端特性,排重键。表示这个字段唯一,标记于 Entity 中,用于更新写入的时候排重判断。
你建不建索引是另外一码事,多个之间默认是 Or 关系,如果要 And 需要标注 PasteBatchMutex。

服务端特性,排重特性,表示多个字段排重,对应字段上需要标注 PasteMutex。
表示新增或者更新的时候,多个字段的关系是 And 关系;如果是 Or 关系,则删除当前特性即可。

服务端特性,外表绑定。比如为角色分配权限(当前为 Role 表)。
在 InputQueryXXX 上绑定表示查询扩展,只允许一个;在 ListDto 上绑定表示更新绑定数据,允许多个。

字段 类型 示例 说明
args1 字符 GradeBindRole EntityName
args2 字符 RoleId 表示当前表,比如 RoleInfo,那 ExtendBind 也在这个表
args3 字符 GradeId 关联字段
args4 字符 grade_id 来源于哪个参数

服务端特性,创建字段查询项。
比如用户表,你在 Name 和 Desc 都打上这个特性,那么在生成的表格页面中,搜索区域就会多 2 个输入框,对应 Name 的检索和 Desc 的检索,默认是 = 查询。

服务端特性,查询范围。有别于时间区间,这个一般用于表示数值类型,比如 80-90 分成绩,小的包含,大的不包含。

字段 类型 示例 说明
args1 字符 minLimit 开始(包含),默认为 minLimit
args2 字符 maxLimit 结束(不包含),默认为 maxLimit
args3 字符 1 表示输入粒度,比如 1 还是 0.01 等
args4 字符 留空 备用

发现更多文档

来自贴代码的公开项目