『贴代码』
PasteSpider
PasteForm
精选作品
优选问答
成长笔记
【本期话题】更多
                                    我们在开发中经常遇到对方的接口请求有频率限制,比如当前接口每秒的请求不能大于100,不能大于1000,对于这样的,我们作为请求方,如何做限定?
                    
千呼万唤始出来,按钮控制终于来了!!!PasteForm实现权限按钮就是这么简单
随风 2026-01-08 31 1 3
在管理系统中,菜单和按钮权限是常用的需求,以往的开发往往是管理端前端来控制,后端只做列表返回,这个方式虽然逻辑简单,但是我感觉还是不够灵活的,一起来看看PasteForm是如何处理这个问题的!

更多特性PasteForm的介绍,请前往PasteForm操作文档查看 PasteForm操作文档与介绍


版本要求

要实现页面按钮权限控制,你得PasteFormHelper的版本必须是26.1.5以上!

<PackageReference Include="PasteFormHelper" Version="26.1.6" />

函数变更

之前我们把Dto转化成管理端元数据使用的函数是

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

关键点就是

AttributeReadModelProperty

如果你要改成按钮权限过滤,则需要修改成如下

        /// <summary>
        /// 读取ListDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<VoloModelInfo> ReadListModel()
        {
            //var buttons = new List<ButtonRoleModel> { new ButtonRoleModel { Path="AreaInfoListDto",Code="root1" }, new ButtonRoleModel { Path = "AreaInfoListDto", Code = "root2" } };
            //var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), buttons);
            var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), await base.CurrentButtonsAsync());
            var _query_model = PasteBuilderHelper.AttributeReadModelProperty(new InputQueryAreaInfo());
            if (_query_model != null)
            {
                _model.QueryProperties = _query_model.Properties;
            }
            return _model;
        }

关键点在函数AttributeReadModelProperty2的调用
传入的buttons
这里有几个约定!
如果你传入null表示不启用按钮权限过滤,也就是全部放行!
如果你要传入说,当前用户没有权限,则你应该传入空数组而不是null

PasteMenu PasteButton PasteIfMenu

需要实现按钮权限显示,你在[PasteMenu] [PasteIfMenu] [PasteButton] 中,传入btnCode,表示按钮值
如果不传入btnCode表示不启用过滤,也就是全部放行!

    ///<summary>
    ///地区数据
    ///</summary>
    [Description("地区数据")]
    [PasteEnable(0, 1, 1, 1)]
    [PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
    [PasteButton("完善全名称信息", "func_area_fullname()", "", "", btnCode: "admin2")]
    [PasteButton("载入数据", "global_load_area_data()", "", "重新载入地区原始数据", btnCode: "admin")]
    [PasteButton("备份数据", "global_backup_area_data()", "", "保存现有的地区数据")]
    public class AreaInfoListDto : EntityDto<long>
    {

    }

注意看我上面的
那么在权限列表的时候怎么配置的呢?
图片alt
路径就是上面案例中的Path,你也可以用表示所有
权限就是,上面特性配置的btnCode,当然,也支持
表示所有

权限中配置按钮的作用,就是最终读取给当前用户的buttons

按钮处理

我们都知道,像新增,编辑,详细,删除等都是默认按钮,其中新增按钮最为特殊!
如果你要把新增按钮改成可控制的,你需要

    [PasteEnable(0, 1, 1, 1)]
    [PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]

不知道你是否还记得[PasteEnable]
表示的意思是,是否启用,新增,编辑,删除,详细,设置为1表示启用,设置为0表示禁用,
上面的意思就是先禁用系统默认的!
然后在设置

[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]

这里面的add就是对应的新增默认按钮,而函数tap_add_form就是新增的点击事件,照着写就行了!
注意
!!上面的这2个的特性顺序不能变,先禁用,然后配置,配置了add后会启用按钮,关键点在于btnCode引入了权限!!

至于表格中的编辑,详细,删除按钮,那就全部禁用,然后自行实现即可,比如

        /// <summary>
        /// 删除
        /// </summary>
        [PasteHidden]
        [PasteMenu("删除", "handler_tap_del(this)", btnCode: "del")]
        public int Menu1 { get { return 0; } }

注意
如果给[PasteMenu]配置了btnCode,在他上面要标记[PasteHidden],
因为前端是找到了PasteMenu的时候,才把对象隐藏的,如果没有权限,则直接返回Menu1了,会被当前表格的列处理了!
[PasteIfMenu]同理!!!

总结

由上,是否发现使用PasteForm要实现按钮权限控制显得非常简单,也符合PasteForm的宗旨“All in Dto”!
只需要在Dto中写一两行代码,即可实现基于用户的权限控制!!!
注意这里的操作,只是针对管理端,如果用户F12自己修改了,还是能调用的,所以安全问题不在前端,而在后端!
也就是后端还是要进行权限控制的!!!
如果是有AppService的接口可以配置权限,那么如果使用DefaultAppService的如何控制权限呢?
请查看[PasteAuth]特性,就是专门为DefaultAppService的权限控制的!!!

评论列表
贴代码

删除
tap_del_item(elc,id)
编辑
tap_view_item(elc,id)
详细
tap_detail_item(elc,id)

所以对应的特性写法可以是这样的



        /// <summary>
        /// 编辑
        /// </summary>
        [PasteHidden]
        [PasteMenu("编辑", "tap_view_item(this,{{:=item.id}})", btnCode: "root")]
        public int Menu20 { get; set; }

        /// <summary>
        /// 详细
        /// </summary>
        [PasteHidden]
        [PasteMenu("详细", "tap_detail_item(this,{{:=item.id}})", btnCode: "root")]
        public int Menu30 { get; set; }

        /// <summary>
        /// 删除
        /// </summary>
        [PasteHidden]
        [PasteMenu("删除", "tap_del_item(this,{{:=item.id}})", btnCode: "root")]
        public int Menu40 { get; set; }
贴代码
UI显示是UI显示,具体的权限还是需要API对应的地方控制的,请知悉!!!
12345
终于支持了!
随风
1 31 3
快捷注册
用户问答更多
PasteForm,神奇了啊!都说低代码,低代码,那个是对于非开发者来说的,感觉PasteForm就是开发者的低代码啊!只要配置好Model,就有对应的CRUD操作,还带一些逻辑,和生成代码是两码事了!!!问题来了,有什么局限性,或者适用哪些场景?
07月份版本的内存占用比以前大了,也没有泄漏,啥情况?以前200MB,这个版本能到300MB
  • 应该和之前的PasteForm引入有关,之前的版本引入了大量的API,看看10月份或者11月份的版本,新版本的PasteForm极大的优化了API接口量,可以说直接从4N优化到了N个(N代表数据表数量)

文档中的组织归属有些问题,啥时候看看,更新更新!
  • 已经升级了,主要是left join的查询的时候没有过滤,其实这个问题,多租户也是一样的!

最新动态
  • 66.****.200 正在查看 PasteSpider之私有仓库的创建和使用 !
  • 49.****.254 正在查看 PasteSpider之2025年06月更新一栏 !
  • 116.****.24 正在查看 记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-Web.IIS.Administration解读(5 !
  • 113.****.27 正在查看 PasteSpider之项目环境-同步过滤-键值配置介绍 !
  • 185.****.5 正在查看 正在查看笔记:48 的详细信息 Page:1 ! !
  • 113.****.62 正在查看 正在查看笔记:29 的详细信息 Page:1 ! !
  • 18.****.11 正在查看 Document:spider !
  • 58.****.28 正在查看 正在查看笔记:48 的详细信息 Page:1 ! !
  • 116.****.81 正在查看 Document:spider !
  • 119.****.125 正在查看 使用Obfuscar混淆(加密)你的程序源码并一键发布! !
  • 82.****.160 正在查看 PasteSpider测试环境之为centos7中的ssh启用证书登陆模式 !
欢迎加入QQ讨论群 296245685 [PasteSpider]介绍 [PasteForm]介绍 @2022-2023 PasteCode.cn 版权所有 ICP证 闽ICP备2021013869号-2