PasteFormHelper 25.9.5

There is a newer version of this package available.
See the version list below for details.
dotnet add package PasteFormHelper --version 25.9.5
                    
NuGet\Install-Package PasteFormHelper -Version 25.9.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PasteFormHelper" Version="25.9.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PasteFormHelper" Version="25.9.5" />
                    
Directory.Packages.props
<PackageReference Include="PasteFormHelper" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add PasteFormHelper --version 25.9.5
                    
#r "nuget: PasteFormHelper, 25.9.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package PasteFormHelper@25.9.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=PasteFormHelper&version=25.9.5
                    
Install as a Cake Addin
#tool nuget:?package=PasteFormHelper&version=25.9.5
                    
Install as a Cake Tool

贴代码框架PasteForm简介

25.09.04

1.考虑添加Tolong(距离转化,米转KM) Tosize(字节转化字节转KB MB GB TB DB等)

25.09.04

1.Description可以设置为空,表示故意留空!
2.预先添加PasteHalfRow,表示半行显示,其实就是字段超出64后,不做单行标记处理
3.PasteFieldQuery表示自建检索项

25.09.02

1.修复enable PasteEnableAttribute的逻辑问题,这个问题导致新增编辑详细不听使唤的问题
2.修改部分特性的说明,比如PasteOuterAttribute的args1

25.08.06

1.directsun和sort一起使用的时候,sort时效的问题!
2.上面引入了一个新的问题,那就是内部的排序... .. .
3.注意内部会++排序
4.忘记了,srot比较特殊,不再从特性中获取

25.08.04

1.修改PasteAuth
2.添加Enable针对Disable的反配置容易混淆的问题
3.针对PasteAuth添加对应的帮助函数,用于判断是否有权限等

25.08.02

1.添加标记,是否是服务端使用的特性,如果是则不返回给前端
2.添加对accept的支持,也就是file特性PasteFile

25.08.001

1.添加PasteBatchMutexAttribute表示Mutex是And关系,默认是Or关系

25.07.17

1.text textarea添加对style/class/singlerow的支持
2.由于前端配置信息的引入,disable添加反向标记,比如配置启用,这里配置禁用,以特性标注为准
3.对应的添加了一些注释说明

25.07.16

1.默认字段的预留注释,尽量减少代码显示,比如name id createDate userId desc mark等

25.07.15

1.添加PasteAuth,用于DefaultAppService的授权判断,支持多个
2.PasteDisable用于ListDto和Entity,一个是给UI,一个是给DefaultAppService

25.07.10

1.PasteExtendBindAttribute重新定义
    在InputQuery的时候表示读取的时候使用,也就是读取绑定状态
    在ListDot中的ExtendBind上表示写入的时候,也就是更新绑定
2.PasteFileAttribute添加filter过滤字符串,默认*.*

25.07.09

1.添加对PasteExtendBindAttribute的支持 用于扩展绑定,比如角色绑定权限,用户绑定角色使用! 要绑定啥就在啥的Query和ListDto中标记!
2.添加对PasteMutexAttribute的支持 用于写入,更新排重
3.?绑定是否可以多个... .. . 理论上修改加判断后是可以的! 关键在查询和检索上

25.07.06

1.如果没有Description特性,或者是没有注释(XML模式),则Name赋值给Title,这样防止空...
2.如果是故意留空呢???这个留给后续考虑,估计得引入新的特性了
3.修复Class的Title的问题
4.添加okaction特性,管理端下一个版本支持!

25.07.03

1.修复Class获取Desc引发异常的问题!

25.07.01

1.重大更新!重大更新!
2.添加配置 create_appservice 表示是否创建AppService,因为你可以使用默认的DefaultAppService
3.DefaultAppService的内容如下,目前还有一些问题

1.目前没有考虑Include的情况
2.目前的多表查询是使用的分步查询,因为GroupJoin有一个问题,Queryable和DbSet分不清

1.新增字段PasteFieldAttribute,表示当前字段要基于哪个字段(args1)查询,支持运算符(args2)
2.支持时间等查询,包含,大小,不等等!

1.25.07.02之后版本,支持非XML模式,也就是你得使用DescriptionAttribute这个特性,也是支持Enum的,写法一样,空格区分
2.为了兼容旧版本,新的要调用AttributeReadModelProperty(非XML模式)

25.06

1.进一步缓存XML文档,提高读取效率

25.05

1.?字段覆盖的问题,因为有继承Class的时候,如果类型不一致,会导致2个字段!,所以是否需要排重?感觉自行调整Dto更划算!
2.添加PasteSearch PasteShort等特性,主要用于生成代码,特别是外表的代码

25.04

1.directsun子对象模式的时候添加对Hidden的支持,也就是默认隐藏,UI是有对应代码的
2.缓存xml信息,读取当前文件夹(执行程序同级)下的xml文件,作为字段注释的数据源,提升第二次以上的读取速度
3.添加charty chartx ui chartseries特性,用于表格数据的图表显示用
4.添加hide,和hidden有点不一样,hidden可能被显示,hide不会有ui,hidden相当于readonly的隐藏款
5.修复select lselect selects关于ignore的问题,之前的判断有问题,其实就是枚举类型的名称和值的问题!
6.排序规则调整,也就是sort特性,拆分3块,小于0的,大于0的 为0的 按照升序排序,小于0的在前面,为0的保持 大于0的在后面

7.添加对minbtn的支持,这个用于table的edit的输入框后面的小按钮
8.新增switch在table模式下的功能,args4,默认为远端模式,也就是点击后会执行事件,设置为false后,不会执行事件表示本地模式,一般用于table.edit模式下!
9.优化enum的取值
10.优化xml的缓存等
11.添加nullable的支持,如果没有值,则不提交,表示null

12.nextkey修改成next_key,然后是启用args1,表示字段,主要用于查询的字段和返回数据的next_key字段不一致的问题!

25.03.30

1.修复loadlib的适用范围问题,应该是class之前是property
2.添加changeui字段 ,表示当前字段选中为某一个值的时候显示某些字段或者组,或者隐藏某些字段或者组
3.group特性,3参数调整,多一个重载,open close hidden hidden表示隐藏,可以显示出来,其他2个表示展开还是收缩,意义不一样
3.如果是directsun,可以结合hidden这样就可以创建隐藏的组了,主要是用于changeui特性!
4.上一个版本写错了,应该是如果命中则显示这些字段,如果没命中则隐藏,这样如果是多模式,直接全部隐藏,然后按照默认值来配置!
//不对 不对 1,3,5 如果是1,则隐藏35 如果是2,则隐藏15

25.03.28

1.添加loadlib
2.switch扩展args2,args3
3.添加edit表示是否是编辑模式

25.03.22

1.添加directsun
2.添加nextkey
3.添加loaditem
4.子对象的null值问题,之前的有问题,传递的是父级的值
5.支持list<object>等,默认给与默认组,需要有文档注释作为组名
6.修复dynamic中enum没有添加的问题
7.list的group添加edit模式,可以基于当前新增或者删除某一项

25.03.17

1.处理这种问题EnumAction[] actions 这样的array枚举类型
2.如果是DynamicReadTypeProperty/DynamicReadModelProperty则字段是object类型的会以__分割返回,注意数组不会返回
3.sunform添加class表示使用哪个样式,多一个选择!

25.03.16

1.取消sort的排序,只做标记,需要由API来排序,因为有些Model有多层级关系,直接排序会有问题,和意向不一定符合
2.添加对sunform的支持,以一个iframe的形式嵌套子对象
3.添加对datalist的支持,这里还有一个问题,就是UI中友好显示的问题,不过这个问题是UI侧考虑的
4.selects,lselect,select,datalist的忽略列表,支持非int的数据类型,之前只支持Int的,也就是现在string也支持了
5.添加对Type的支持,也就是你可以做动态读取了,请做好校验!!!(比如传递字符串"UserInfo",根据查询获得结构体和默认值)

25.2.15

1.添加point特性
2.部分特性补充字段,用于便于二开
3.修复注释中的_*_不会替换为空格的问题
4.调整部分特性的说明等

25.1.18

1.在注释中_*_会被替换成空格显示

25.1.6

1.修复部分单词错误的问题
2.添加部分特性的重载,适用于不同使用环境
3.部分添加缺省参数,便于二开也就是补全args1,args2,args3,args4等

25.1.1

1.添加sort的支持,用于排序,小的排前面,默认为0
2.添加readonly,sort,required

24.12.1

1.添加特性Empty Objects Html等
2.修改Outer的注释,主要是第一个参数其实是支持path的

24.11.9

1.添加分组特性group,可以作用于class和字段
2.修复之前的部分特性的说明

24.11.8

1.添加新的特性File
2.Password
3.Split
4.style
5.button等
6.注释掉文档找不到的Console打印
7.修改dto的继承深度最大为5
8.注意Dto或者Enum要存放在Domain,或者Applciation.Contracts子项目中

24.11.7

1.注释文档找不到的打印
2.添加orderby等特性
3.修复outer特性的第二个参数错误的问题

24.11.16

1.PasteLinkQuery的支持

24.11.15

1.修复enum模式下的select lselect slects的ignore的配置问题,因为是obj类型,所以要用(int),也就是enmu只适用于int

在日常开发中,特别是涉及到管理端页面的,你是否被大量的表单和表格而淹没,是否由于前后端的改动造成的版本差异而烦恼,是否为反复的修改而头疼,现在PasteForm可以解决你这个问题!

基于ABPvNext框架精简而来的案例项目PasteForm,里面包含了3个部分

1.ABPvNext框架本身,精简了不需要的其他模块,当然你也可以加回去,比如多租户,比如授权模块等

2.PasteForm贴代码框架,主要输出的是一个思想,就是基于Dto的特性实现大一统的CRUD操作

3.PasteBuilder针对这个框架而开发的代码生成器,你可以自定义自己的生成格式等,特别针对PasteForm中的Dto的特性做了优化

贴代码框架PasteForm主要的思路就是统一管理端,主要指网站的后台,基于Dto的特性,从而控制管理端页面的表单和表格,所以PasteForm是管理端表单和表格共舞的新篇章

PasteForm的源码地址在

https://gitee.com/pastecode/paste-template

下载源码后,你可以查阅PasteForm是如何工作的!

使用概述

大致流程就是管理端(前端,或者小程序端等,通过接受到Dto的属性和特性等信息,然后基于规则渲染UI,所以API和WEB端都需要改造,相对的Web端反而可以直接拿贴代码的来使用,接口端就需要基于实际情况进行改造了,不过放心这个改造不难!借助于PasteBuidler你甚至可以一键生成!!!)

如果只是引用贴代码框架的思想,那么你只要按照PasteForm的思想改造自己的项目即可 如果你的框架是ABPvNext的,有以下子项目

xxx.Application
xxx.Application.Contracts
xxx.Domain
xxx.EntiyFrameworkCore
xxx.HttpApi.Host

那么恭喜你,捡到宝了!

以下是案例项目的代码:

UserInfoAppService中获取不同Dto的接口

        /// <summary>
        /// 读取AddDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "add" })]
        public PasteBuilderHelper.VoloModelInfo ReadAddModel()
        {
            var _model = PasteBuilderHelper.ReadModelProperty<UserInfoAddDto>(new UserInfoAddDto());
            return _model;
        }

        /// <summary>
        /// 读取UpdateDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "edit" })]
        public async Task<PasteBuilderHelper.VoloModelInfo> ReadUpdateModel(int id)
        {
            var _info = await _dbContext.UserInfo.Where(x => x.Id == id).AsNoTracking().FirstOrDefaultAsync();
            if (_info == null || _info == default)
            {
                throw new PasteCodeException("查询的信息不存在,无法执行编辑操作!");
            }
            var dto = ObjectMapper.Map<UserInfo, UserInfoUpdateDto>(_info);
            var _query_gradeid = _dbContext.UserGrade.Where(x => x.UserId == _info.Id).Select(x => x.GradeId);
            var grades = await _dbContext.GradeInfo.Where(x => _query_gradeid.Contains(x.Id)).AsNoTracking().ToListAsync();
            if (grades != null && grades.Count > 0)
            {
                dto.Grades = ObjectMapper.Map<List<GradeInfo>, List<GradeInfoListDto>>(grades);
            }

            dto.PassWord = "";//密码只有重置,没有修改
            var _dataModel = PasteBuilderHelper.ReadModelProperty<UserInfoUpdateDto>(dto);
            return _dataModel;
        }
        /// <summary>
        /// 读取UpdateDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<PasteBuilderHelper.VoloModelInfo> ReadDetailModel(int id)
        {
            var _info = await _dbContext.UserInfo.Where(x => x.Id == id).AsNoTracking().FirstOrDefaultAsync();
            if (_info == null || _info == default)
            {
                throw new PasteCodeException("查询的信息不存在,无法执行编辑操作!");
            }
            var dto = ObjectMapper.Map<UserInfo, UserInfoDto>(_info);
            var _dataModel = PasteBuilderHelper.ReadModelProperty<UserInfoDto>(dto);
            return _dataModel;

        }

        /// <summary>
        /// 读取ListDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public PasteBuilderHelper.VoloModelInfo ReadListModel()
        {
            var _model = PasteBuilderHelper.ReadModelProperty<UserInfoListDto>(new UserInfoListDto());
            var _query_model = PasteBuilderHelper.ReadModelProperty(new InputQueryUserInfo());
            if (_query_model != null)
            {
                _model.QueryProperties = _query_model.Properties;
            }
            return _model;
        }

UserInfo的不同Dto对应的特性的写法

    ///<summary>
    ///用户信息
    ///</summary>
    public class UserInfoAddDto
    {
        ///<summary>
        ///邮箱
        ///</summary>
        [MaxLength(64)]
        [Required]
        public string Email { get; set; } = "";

        ///<summary>
        ///密码
        ///</summary>
        [MaxLength(64)]
        [ColumnDataType("password")]
        [Required]
        public string PassWord { get; set; } = "";

        ///<summary>
        ///用户名
        ///</summary>
        [MaxLength(32)]
        [Required]
        public string UserName { get; set; } = "";

        ///<summary>
        ///描述
        ///</summary>
        [MaxLength(64)]
        public string Desc { get; set; } = "";

        ///<summary>
        ///头像
        ///</summary>
        [MaxLength(128)]
        [ColumnDataType("image", "1", "head", "60*60")]
        public string UserHead { get; set; } = "";

        ///<summary>
        ///状态
        ///</summary>
        public bool IsEnable { get; set; } = true;

        /// <summary>
        /// 角色 包含的角色,这个暂未实现,应该会归纳到outers去
        /// </summary>
        [ColumnDataType("outers", "gradeInfo", "", "id", "name")]
        public int[] GradeIds { get; set; }

    }

    ///<summary>
    ///用户信息
    ///</summary>
    public class UserInfoUpdateDto : EntityDto<int>
    {
        ///<summary>
        ///邮箱
        ///</summary>
        [MaxLength(64)]
        [Required]
        public string Email { get; set; } = "";

        ///<summary>
        ///密码
        ///</summary>
        [MaxLength(64)]
        [ColumnDataType("password")]
        public string PassWord { get; set; } = "";

        ///<summary>
        ///用户名
        ///</summary>
        [MaxLength(32)]
        [Required]
        public string UserName { get; set; } = "";

        ///<summary>
        ///描述
        ///</summary>
        [MaxLength(64)]
        public string Desc { get; set; } = "";

        ///<summary>
        ///头像
        ///</summary>
        [MaxLength(128)]
        [ColumnDataType("image", "1", "head", "60*60")]
        public string UserHead { get; set; } = "";

        ///<summary>
        ///状态
        ///</summary>
        public bool IsEnable { get; set; } = true;

        /// <summary>
        /// 角色 包含的角色,这个暂未实现,应该会归纳到outers去
        /// </summary>
        [ColumnDataType("outers", "gradeInfo", "grades", "id", "name")]
        public int[] GradeIds { get; set; }

        /// <summary>
        /// 扩展 包含的角色列表
        /// </summary>
        [ColumnDataType("hidden")]
        public List<GradeInfoListDto> Grades { get; set; }

    }

    ///<summary>
    ///用户信息
    ///</summary>
    public class UserInfoDto : EntityDto<int>
    {
        ///<summary>
        ///用户名
        ///</summary>
        public string UserName { get; set; }

        ///<summary>
        ///头像
        ///</summary>
        public string UserHead { get; set; }

        ///<summary>
        ///创建日期
        ///</summary>
        public DateTime CreateDate { get; set; }

        ///<summary>
        ///描述
        ///</summary>
        public string Desc { get; set; }

        ///<summary>
        ///邮箱
        ///</summary>
        public string Email { get; set; }

        ///<summary>
        ///密码
        ///</summary>
        public string PassWord { get; set; }

        ///<summary>
        ///状态
        ///</summary>
        public bool IsEnable { get; set; }

    }

    ///<summary>
    ///用户信息
    ///</summary>
    [ColumnDataType("disable", "", "", "del")]
    public class UserInfoListDto : EntityDto<int>
    {
        ///<summary>
        ///用户名
        ///</summary>
        public string UserName { get; set; }

        ///<summary>
        ///头像
        ///</summary>
        [PasteImage]
        public string UserHead { get; set; }

        ///<summary>
        ///创建日期
        ///</summary>
        public DateTime CreateDate { get; set; }

        ///<summary>
        ///描述
        ///</summary>
        public string Desc { get; set; }

        ///<summary>
        ///邮箱
        ///</summary>
        public string Email { get; set; }

        /////<summary>
        /////密码
        /////</summary>
        //public string PassWord { get; set; }

        ///<summary>
        ///状态
        ///</summary>
        [ColumnDataType("switch")]
        public bool IsEnable { get; set; }

    }

    ///<summary>
    ///用户信息
    ///</summary>
    public class UserShortModel
    {
        /// <summary>
        /// 
        /// </summary>
        public int Id { get; set; }

        ///<summary>
        ///用户名
        ///</summary>
        public string UserName { get; set; }

        ///<summary>
        ///头像
        ///</summary>
        public string UserHead { get; set; }

        /////<summary>
        /////创建日期
        /////</summary>
        //public DateTime CreateDate { get; set; }

        /////<summary>
        /////描述
        /////</summary>
        //public string Desc { get; set; }

        /////<summary>
        /////邮箱
        /////</summary>
        //public string Email { get; set; }

        /////<summary>
        /////密码
        /////</summary>
        //public string PassWord { get; set; }

        /////<summary>
        /////状态
        /////</summary>
        //public bool IsEnable { get; set; }

    }

    ///<summary>
    /// 查询
    ///</summary>
    public class InputQueryUserInfo : InputSearchBase
    {
        /// <summary>
        /// 日期区间
        /// </summary>
        [ColumnDataType("daterange", "sdate", "edate")]
        public DateTime? sdate { get; set; }

        /// <summary>
        /// 日期区间
        /// </summary>
        [ColumnDataType("hidden")]
        public DateTime? edate { get; set; }
    }

更多更详细的请到论坛查看

https://soft.pastecode.cn/Articles/1/1

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net6.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
26.1.8 94 1/17/2026
26.1.7 105 1/9/2026
26.1.6 98 1/8/2026
26.1.5 99 1/8/2026
26.1.4 92 1/8/2026
26.1.3 93 1/8/2026
26.1.2 100 1/5/2026
26.1.1 94 1/4/2026
25.11.3 178 11/27/2025
25.11.2 182 11/26/2025
25.11.1 204 11/9/2025
25.10.3 146 10/26/2025
25.10.2 177 10/16/2025
25.10.1 175 10/9/2025
25.9.5 177 10/8/2025
25.9.4 163 9/26/2025
25.9.2 313 9/17/2025
25.9.1 179 9/11/2025
25.8.11 177 8/31/2025
25.8.9 318 8/25/2025
Loading failed

享受Dto特性驱动管理端的乐趣吧!https://soft.pastecode.cn/doc/form/