上一个篇幅中介绍了,针对当前项目改造密钥,也就是登陆后的密钥串 本次主要介绍的是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相关的内容
下期见