sort

排序,这个是表单字段排序
不过没有实现的,需要api中做排序
PasteFormHelper只是把这个sort给读取出来!

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

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

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的字段的!

超级管理员
edit

这个特性很重要!
就是表格支持编辑模式
目前支持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

超级管理员
switch

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出场了!

超级管理员
loadlib

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

字段 类型 示例 说明
args1 字符 ../lib/pro.js 表示载入当前上一个文件夹的lib下的pro.js文件,也可以载入css要看尾巴!
args2 字符 func_name 如果是js结尾的,这个可以填写,表示载入后要执行的哪个函数,注意这个函数没有参数
超级管理员
立即前往参与当前项目管理 sort orderby edit switch loadlib
贴代码框架
贴代码框架PasteForm的在线文档,主要介绍理念和特性及实际案例!
贴代码文档
什么才叫操作文档?对于操作人员来说,遇到哪个字段不懂意思,点击下即可查阅说明,这就是最好的文档!
PasteSpider在线操作文档
PasteSpider是专门为开发者开发的部署工具,五分钟上手,小内存服务器也可以使用,使用旁载模式,运行更安全!!!目前仅支持linux的服务器,win服务器的版本将在不久到来!
贴代码在线客服文档
是客服系统也是营销系统,支持丰富的话术配置,支持自定义消息格式,支持多站点入驻模式,一键部署快速搭建!