ApiControler中的保存行为解析
- AddNew流程
系统接收请求→构造FormConvert→构造Data对象→ReadFormData方法填充数据→Business.AddNew→返回操作结果
这两种用户调用的保存操作,数据的__IsFromUser属性会被设置为true,以便识别行为类型
- Update流程为 :
系统接收请求→构造FormConvert对象→通过ID读取数据库最新数据→ReadFormData方法填充数据→Business.Update→返回操作结果
我们采用无并发处理方式,所以在Update操作时会先通过ID读取数据库最新数据 。
- FormConvert类
在保存操作(AddNew\Update)时构造,在ReadFormData重载方法中使用。FormConvert类提供ToXXX族方法方便地获取表单的值
内部也是将Form表单数据预读到Arguments属性
- 重载ReadFormData方法填充数据
数据填充的方法重要但很无趣,所以默认这部分工作由设计器生成代码完成。
为了让你能抄到生成的代码,所以生成在代码在的DefaultReadFormData方法中。
- 如何自定义控制
当你感觉设计器生成的代码不够用时,你可以在ReadFormData中直接手工处理。我们建议可用的代码直接复制过来,防止手贱打错字而出现BUG。
在Business类中操作
- 打开生成的BL代码类
在DataModel项目中的Business目录下,一般文件名为 [实体名称]BusinessLogic.cs
- 删除代码生成器写入标记(特别重要)
- 根据你需要,重载如下方法的一或多个
/// <summary>
/// 保存前的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaving(DemoEntityData data, bool isAdd)
{
return base.OnSaving(data, isAdd);
}
/// <summary>
/// 保存完成后的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaved(DemoEntityData data, bool isAdd)
{
return base.OnSaved(data, isAdd);
}
/// <summary>
/// 被用户编辑的数据的保存后操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool LastSavedByUser(DemoEntityData data, bool isAdd)
{
return base.LastSavedByUser(data, isAdd);
}
/// <summary>
/// 被用户编辑的数据的保存前操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool PrepareSaveByUser(DemoEntityData data, bool isAdd)
{
return base.PrepareSaveByUser(data, isAdd);
}
按注释说明选择在对应的方法中填写代码。
举个例子
需求
数据在保存前,校验名称是否存在,如果存在,则保存失败
编码
/// <summary>
/// 保存前的操作
/// </summary>
/// <param name="data">数据</param>
/// <param name="isAdd">是否为新增</param>
/// <returns>如果为否将阻止后续操作</returns>
protected override bool OnSaving(DemoEntityData data, bool isAdd)
{
//扩展代码
bool existName = isAdd
? Access.Any(p => p.Name == data.Name)
: Access.Any(p => p.Name == data.Name && p.Id != data.Id);
if (existName)
{
//Api返回时会取这两个值来写入错误信息中
GlobalContext.Current.LastState = ErrorCode.LogicalError;
GlobalContext.Current.LastMessage = "名称已存在,保存失败";
return false;
}
//扩展代码结束
return base.OnSaving(data, isAdd);
}
说明:
- Save已在基类中统一封装,所以我们通过对GlobalContext.Current的两个上下文属性来赋错误值.
- 尽量保持对基方法的调用.以提高代码的身后兼容.