从零开始开发PasteDocument(贴代码PasteForm框架实战序列)(5)-特性处理

122 阅读3分钟

上一个篇幅中介绍了,针对当前项目改造密钥,也就是登陆后的密钥串 本次主要介绍的是PasteForm相关的内容 也就是Dto的特性的实战利用 通过对Dto中的字段或者Class的特性标注,以便实现表单中不一样的体现!

基本特性

在这里插入图片描述 如上图,是项目的新增打开后的表单页面,可以看到PasteForm的作用支持字段的默认值,必填,大小,显示方式,placeholder,图片方式等

Markdown还是HTML

在这里插入图片描述 在文档中的字段这个信息中,有些人喜欢用MarkDown,有些人喜欢用HTML,所以PasteDocument针对这个问题,做了适配,都支持! 那么什么时候使用Markdown,什么时候使用HTML呢? 由上图的EditModel来决定 在创建的时候,我们来看看对于前端他是如何返回的,关键在字段context和markDown

        /// <summary>
        /// 读取AddDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "add" })]
        public PasteBuilderHelper.VoloModelInfo ReadAddModel()
        {
            var dto = new FieldInfoAddDto { };
            if (base._httpContext.Request.Query.ContainsKey("edit_model"))
            {
                int.TryParse(base._httpContext.Request.Query["edit_model"].ToString(), out var bstyle);
                dto.EditModel = (EnumEditModel)bstyle;
            }
            var _model = PasteBuilderHelper.ReadModelProperty<FieldInfoAddDto>(dto);
            FiexModel(_model, dto.EditModel);
            if (base._httpContext.Request.Query.ContainsKey("module_code"))
            {
                var find = _model.Properties.Where(x => x.Name == "moduleId").FirstOrDefault();
                if (find != null && find != default)
                {
                    _model.Properties.Remove(find);
                }
            }
            return _model;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="_model"></param>
        /// <param name="emodel"></param>
        private void FiexModel(PasteBuilderHelper.VoloModelInfo _model, EnumEditModel emodel)
        {
            switch (emodel)
            {
                case EnumEditModel.html:
                    {
                        var find = _model.Properties.Where(x => x.Name == "markDown").FirstOrDefault();
                        if (find != null)
                        {
                            //if (find.Attributes == null)
                            //{
                            //    find.Attributes = new List<PasteBuilderHelper.VoloModelAttribute>();
                            //}
                            //var find_hide = find.Attributes.Where(x => x.Name == "hidden").FirstOrDefault();
                            //if (find_hide == null || find_hide == default)
                            //{
                            //    find.Attributes.Add(new PasteBuilderHelper.VoloModelAttribute() { Name = "hidden" });
                            //}
                            _model.Properties.Remove(find);
                        }
                    }
                    break;
                case EnumEditModel.markdown:
                    {
                        var find = _model.Properties.Where(x => x.Name == "context").FirstOrDefault();
                        if (find != null)
                        {
                            //if (find.Attributes == null)
                            //{
                            //    find.Attributes = new List<PasteBuilderHelper.VoloModelAttribute>();
                            //}
                            //var find_hide = find.Attributes.Where(x => x.Name == "hidden").FirstOrDefault();
                            //if(find_hide==null || find_hide== default)
                            //{
                            //    find.Attributes.Add(new PasteBuilderHelper.VoloModelAttribute() { Name="hidden" });
                            //}
                            _model.Properties.Remove(find);
                        }
                    }
                    break;
            }
        }

从上面的代码可以解析出,在对接口读取对应dto数据的时候,接口会从url中读取,是否附带了edit_model,读取他的值,从而修改editModel的值 根据editModel的不同值,针对字段context或者markDown做不一样的处理 这样前端接收到信息后,就会针对显示HTML模式或者是MarkDown模式 在这里插入图片描述 在内容的存储上,最后的作用上,都是读取html格式的,也就是markdown的保存会保存为2个字段,一个存储markdown内容,一个存储转化成html的内容,这样在使用上就都以显示html为准即可!

动态参数

由于文档对外访问的时候是通过代码的模式而不是ID,所以我们需要把现有的ID做兼容处理,让表单支持ID,也支持Code的模式! 在这里插入图片描述 拿上图的字段的信息添加来做示例,本来只要传递上一级的ModuleId的,由于Module.Code并不是全局唯一的,所以还要引入一个Project.Code 所以就有上面的案例! 默认使用的是ModulId模式,Code的特性可以看到都是PasteHidden的模式,如果打开的表单是Code,这个时候还需要对ModuleId进行隐藏,所以还有一个信息!

        /// <summary>
        /// 读取AddDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "add" })]
        public PasteBuilderHelper.VoloModelInfo ReadAddModel()
        {
            var dto = new FieldInfoAddDto { };
            if (base._httpContext.Request.Query.ContainsKey("edit_model"))
            {
                int.TryParse(base._httpContext.Request.Query["edit_model"].ToString(), out var bstyle);
                dto.EditModel = (EnumEditModel)bstyle;
            }
            var _model = PasteBuilderHelper.ReadModelProperty<FieldInfoAddDto>(dto);
            FiexModel(_model, dto.EditModel);
            if (base._httpContext.Request.Query.ContainsKey("module_code"))
            {
                var find = _model.Properties.Where(x => x.Name == "moduleId").FirstOrDefault();
                if (find != null && find != default)
                {
                    _model.Properties.Remove(find);
                }
            }
            return _model;
        }

读取到当前访问的参数有传递module_code的时候,把字段ModuleId给删除掉,这样在表单提交的时候就不会提交这个字段,触发默认值0,符合预期!

基于权限的差异化返回

        /// <summary>
        /// 读取权限的ListDto的数据模型
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "view" })]
        public PasteBuilderHelper.VoloModelInfo ReadListModel()
        {
            var _model = PasteBuilderHelper.ReadModelProperty<RoleInfoListDto>(new RoleInfoListDto());
            var _query_model = PasteBuilderHelper.ReadModelProperty(new InputQueryRoleInfo());
            if (_query_model != null)
            {
                _model.QueryProperties = _query_model.Properties;

                var issystem = base.IsSystemRoot();
                if (issystem)
                {
                    if (_model.Attributes != null)
                    {
                        var _disable = _model.Attributes.Where(x => x.Name == "disable").FirstOrDefault();
                        if (_disable != null && _disable != default)
                        {
                            _model.Attributes.Remove(_disable);
                        }
                    }
                }
                else
                {
                    var finds = _model.Properties.Where(x => x.Name == "menu1" || x.Name == "menu2").ToList();
                    if (finds != null && finds.Count > 0)
                    {
                        _model.Properties.RemoveAll(finds);
                    }
                }
            }
            return _model;
        }

如上代码所示,可以基于当前登陆用户的权限,做一些字段的处理或者Class特性的处理, 比如有权限的可以返回编辑,删除等功能,没有权限的则隐藏这些功能! 当前记得对应的API要做权限处理!

对于特性的处理,以上只是做了一些例子,如果你需要了解更多的PasteForm的特性,可以到 soft.pastecode.cn/Articles/1/…

soft.pastecode.cn/Articles/1/… 了解更多特性信息

我们下期将介绍关于UI相关的内容

下期见