4.新增/编辑页面基类-EditPageBase<T>
2018-04-03 10:59
344 查看
EditPageBase为泛型抽象类,继承自FuncPageBase
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。允许对个别泛型的类型参数进行约束,包括以下几种形式(假设 C是泛型的类型参数, 是一般类、泛类,或是泛型的类型参数):T 是一个类。T 是一个值类型。T 具有无参数的公有建构方法。T 实现接口 I 。T 是 C ,或继承自 C 。
抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
个人泛型总结
EditPageBase如图所示:
新增/编辑页面基类的目的是为了能够快速、准确的完成增删改查操作。
Entity与OldEntity:在mvc中EF默认会缓存查询过的数据。在编辑的情况下,需要先在一个Action查询数据然后在另一个Action中更新数据,如果更新时所用实体非查询所得实体则会报错或更新后查询到的数据并未发生更改。网上多推荐使用AsNoTracking()查询,个人感觉浪费了EF的缓存功能,同时还会导致在删除实体时出现错误,需要额外处理,不仅麻烦而且降低了系统的稳定性在这里分别使用Entity与OldEntity来区分新增和更新、删除。新增时,一般情况只需new实体返回即可,而编辑时所有的操作(更新/删除)均是对查询到的实体进行操作。
InitPage:InitPage中主要是用来判断当前操作是新增还是编辑,并赋值给FormMode(当前操作模式),同时还调用前端传递数据验证方法ValidateFormData()进行服务器端验证,并对验证结果进行处理。
Save:在Save方法中,首先对数据实体进行必要的数据补充,如创建人、更新人及时间等信息。然后根据FormMode(当前操作模式)判断是进行什么操作(创建/更新),并返回操作是否成功。
子类要重写的方法中包括如图所示几部分:
新增/编辑页面实例代码:
至此,一套完整的系统流程基本搭建完成,后续会分享网站的初始化流程、导航的生成、用户注册/登录、权限控制等内容。
EditPageBase源码下载:源码
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。允许对个别泛型的类型参数进行约束,包括以下几种形式(假设 C是泛型的类型参数, 是一般类、泛类,或是泛型的类型参数):T 是一个类。T 是一个值类型。T 具有无参数的公有建构方法。T 实现接口 I 。T 是 C ,或继承自 C 。
抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
个人泛型总结
EditPageBase如图所示:
新增/编辑页面基类的目的是为了能够快速、准确的完成增删改查操作。
Entity与OldEntity:在mvc中EF默认会缓存查询过的数据。在编辑的情况下,需要先在一个Action查询数据然后在另一个Action中更新数据,如果更新时所用实体非查询所得实体则会报错或更新后查询到的数据并未发生更改。网上多推荐使用AsNoTracking()查询,个人感觉浪费了EF的缓存功能,同时还会导致在删除实体时出现错误,需要额外处理,不仅麻烦而且降低了系统的稳定性在这里分别使用Entity与OldEntity来区分新增和更新、删除。新增时,一般情况只需new实体返回即可,而编辑时所有的操作(更新/删除)均是对查询到的实体进行操作。
InitPage:InitPage中主要是用来判断当前操作是新增还是编辑,并赋值给FormMode(当前操作模式),同时还调用前端传递数据验证方法ValidateFormData()进行服务器端验证,并对验证结果进行处理。
Save:在Save方法中,首先对数据实体进行必要的数据补充,如创建人、更新人及时间等信息。然后根据FormMode(当前操作模式)判断是进行什么操作(创建/更新),并返回操作是否成功。
子类要重写的方法中包括如图所示几部分:
新增/编辑页面实例代码:
namespace ZheYK.Controllers.Admin { public class CustomNameController : EditPageBase<Om_CustomName> { #region << 增删改查 >> public ActionResult ViewCustomName() { List<Om_CustomName> lst = CustomNameBiz.GetAll(MyContext, true); return View(lst); } public ActionResult ViewCustomNameMgmt() { List<Om_CustomName> lst = CustomNameBiz.GetAll(MyContext, true); return View(lst); } public ActionResult ViewCustomNameInfo() { Om_CustomName entity = CustomNameBiz.Get(MyContext, FormId); if (entity == null) { throw new NoticeInfo("当前自定义名称信息不存在或已删除!"); } return View(entity); } public ActionResult EditCustomNameInfo() { if (string.IsNullOrEmpty(FormId)) { Om_CustomName entity = new Om_CustomName(); return View(entity); } else { bool isExist = IsExist(); if (!isExist) { throw new NoticeInfo("当前自定义名称信息不存在或已删除!"); } return View(OldEntity); } } [HttpPost] public ActionResult EditCustomNameInfo(Om_CustomName entity) { try { InitPage(entity); bool isSuccess = Save(); if (isSuccess) { return Json(GetServiceResult(1, "操作成功!"), JsonRequestBehavior.AllowGet); } else { return Json(GetServiceResult(0, "操作失败!"), JsonRequestBehavior.AllowGet); } } catch (NoticeInfo ex) { return Json(GetServiceResult(0, ex._Message), JsonRequestBehavior.AllowGet); } } public ActionResult DelCustomNameInfo() { try { bool isExist = IsExist(); if (!isExist) { return Json(GetServiceResult(0, "当前自定义名称信息不存在或已删除!"), JsonRequestBehavior.AllowGet); } int result = DeleteEntity(); if (result > 0) { return Json(GetServiceResult(1, "操作成功!"), JsonRequestBehavior.AllowGet); } else { return Json(GetServiceResult(0, "操作失败!"), JsonRequestBehavior.AllowGet); } } catch (NoticeInfo ex) { return Json(GetServiceResult(0, ex._Message), JsonRequestBehavior.AllowGet); } } #endregion #region << 实现父类方法 >> protected override string EntityName { get { return "自定义名称信息"; } } protected override int DeleteEntity() { return CustomNameBiz.Delete(MyContext, OldEntity); } protected override int InsertEntity() { return CustomNameBiz.Create(MyContext, Entity); } protected override bool IsExist() { Om_CustomName entity = CustomNameBiz.Get(MyContext, FormId); if (entity == null) { return false; } OldEntity = entity; return true; } protected override void SupplementDate() { // 新增 if (FormMode == 1) { Entity.CreateDate = Entity.UpdateDate = DateTime.Now; Entity.CreateUserID = Entity.UpdateUserID = this.MyContext.ID; Entity.CreateUserName = Entity.UpdateUserName = this.MyContext.Name; } // 编辑 if (FormMode == 2) { OldEntity.Name = Entity.Name; OldEntity.UpdateDate = DateTime.Now; OldEntity.UpdateUserID = MyContext.ID; OldEntity.UpdateUserName = MyContext.Name; } } protected override int UpdateEntity() { return CustomNameBiz.Update(MyContext, OldEntity); } protected override string ValidateFormData() { if (string.IsNullOrEmpty(Entity.ID)) { return "自定义名称编号不能为空!"; } if (string.IsNullOrEmpty(Entity.Name)) { return "自定义名称不能为空!"; } return ""; } #endregion } }
至此,一套完整的系统流程基本搭建完成,后续会分享网站的初始化流程、导航的生成、用户注册/登录、权限控制等内容。
EditPageBase源码下载:源码
相关文章推荐
- Bootstrap <基础二十三>页面标题(Page Header)
- 如何理解jsp页面中的“<base href="<%=basePath%>">”
- 项目访问是直接页面 <jsp:forward page="i/1/1"/>跳转前加操作逻辑
- 回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true"
- 回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true"
- 在WEB-INF下的某个页面里使用<jsp:include page="/WEB-INF/personal/yhhead.jsp">,竟然可以访问到
- System.ArgumentException: 回发或回调参数无效。在配置中使用 < pages enableEventValidation="true"/> 或在页面中使用 <% @ Page
- Bootstrap <基础二十三>页面标题(Page Header)
- <base>标签在jsp页面的应用
- 转载:ASP.NET 常用方法类 - PageBase 页面基类
- 回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。
- jsp页面使用表达式<%=basePath%>跳转报“ attribute for %> is not properly terminated”错误
- ASP.NET 常用方法类 - PageBase 页面基类
- SSM中web.xml中配置错误页面时<error-page> ()报错
- eclipse中jsp页面<%@page import="javax.servlet.http.*"%>报错
- 3。css三种定位,<jsp:forward page="转向页面的url地址"/>
- BlogEngine.Net架构与源代码分析系列part12:页面共同的基类——BlogBasePage
- ASP.NET中使用MasterPage和PageBase页面基类(多用户session)(转)
- 转载:如何理解jsp页面中的“<base href="<%=basePath%>">”?
- <jsp:include page=""/>和<%@include file=""%>-----JSP中两种页面引入方式的区别