PasteFormHelper 25.11.3
See the version list below for details.
dotnet add package PasteFormHelper --version 25.11.3
NuGet\Install-Package PasteFormHelper -Version 25.11.3
<PackageReference Include="PasteFormHelper" Version="25.11.3" />
<PackageVersion Include="PasteFormHelper" Version="25.11.3" />
<PackageReference Include="PasteFormHelper" />
paket add PasteFormHelper --version 25.11.3
#r "nuget: PasteFormHelper, 25.11.3"
#:package PasteFormHelper@25.11.3
#addin nuget:?package=PasteFormHelper&version=25.11.3
#tool nuget:?package=PasteFormHelper&version=25.11.3
贴代码框架PasteForm简介
25.11.003
1.针对有些情况,需要mediaid的图片情况,编辑的时候我们希望是可以查看预览,而提交要求是mediaid的情况,可以使用PasteImageExpend特性!
对应的UpImage的返回值也要修改,也就是你上传到服务端,服务端还要上传到三方,然后写入比如media字段中!
读取数据的时候,要进行处理,把mediaid转化成url给图片字段赋值,同时需要把mediaid赋值给PasteImageExpendAttribute这个特性
PasteImage:表示这个字段是上传图片的
PasteImageSelect表示可以使用图片库
PasteExpend表示这个图片一般是Mediaid的模式,值保存的是媒体ID,而不是Url,服务端需要特别处理!
25.11.02
1.添加simg也就是PasteImageselectAttribute用于标注这个图片可以从图片库选择,旧版本是Unit标注,新的引入了更加灵活得页面地址和参数等
25.11.01
1.添加PasteLink和PasteInclude,两个都是服务端特性,用于变更的外键检查,比如UserGrade写入或者更新的时候你得检查UserId,GradeId是否合法!
25.10.02
1.修复10.01版本中对PasteAuth支持不足的问题,现在可以支持多个PasteAuth了,注意是非权限关联的!
2.当前版本支持多个PasteAuth,如果PasteAuth是配置了权限的话,需要手动处理PasteEnable!
25.10.01
1.PasteAuth的false模式,支持自动转化,注意是转化成enable模式,如果是其他PasteAuth模式,需要自行处理!
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; }
}
更多更详细的请到论坛查看
| Product | Versions 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. |
-
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 |
享受Dto特性驱动管理端的乐趣吧!https://soft.pastecode.cn/doc/form/