爱上MVC3系列~将公用的模块提到PartialView
2012-12-03 23:10
323 查看
回到目录
事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象Review就产生了,我们要设计一个视图,它来实现对三个对象的评论功能,没有人会希望同样的功能被重复的开发,相同的代码出现的不同的地方,这当然也违背了DRY原则,所以,我们需要抽象,我们需要封装,我们需要对问题进行面向对象的分析. 第一部:将对象抽象出来,找来不变的与变化的属性 product,user,order共同作用于reviews,我们来看一下review的实体结构
而事实上,除了ObjType与ObjID之外,其它属性对于三大对象来说都是相同的,这时,我们可给在设计视图时,将objtype与objid以参数的形式告诉review,代码如下:
最后通过提交表单将objid和objtype的值post到实体中,然后根据objtype来确实操作完成后页面所重定向的地址. 代码如下:
View的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.
回到目录
事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象Review就产生了,我们要设计一个视图,它来实现对三个对象的评论功能,没有人会希望同样的功能被重复的开发,相同的代码出现的不同的地方,这当然也违背了DRY原则,所以,我们需要抽象,我们需要封装,我们需要对问题进行面向对象的分析. 第一部:将对象抽象出来,找来不变的与变化的属性 product,user,order共同作用于reviews,我们来看一下review的实体结构
/// <summary> /// 评论对象 /// </summary> public class Review { public long ID { get; set; } /// <summary> /// 被评论对象的类型 /// </summary> public int ObjType { get; set; } /// <summary> /// 被评论对象的ID /// </summary> public long ObjID { get; set; } [Required] public string Title { get; set; } [Required] public string Content { get; set; } [Required] public DateTime CreateDate { get; set; } }
/// <summary> /// 系统主要对象的类型 /// </summary> public enum ObjectType { User, Product, Order }
而事实上,除了ObjType与ObjID之外,其它属性对于三大对象来说都是相同的,这时,我们可给在设计视图时,将objtype与objid以参数的形式告诉review,代码如下:
/// <summary> /// 评论公用视图 /// </summary> /// <returns></returns> public ActionResult Review(int? objID, int? objType) { return View(new Review { ObjID = objID ?? 0, ObjType = objType ?? 1, Content = "", Title = "", }); }
最后通过提交表单将objid和objtype的值post到实体中,然后根据objtype来确实操作完成后页面所重定向的地址. 代码如下:
[HttpPost] public ActionResult Review(Review entity) { if (ModelState.IsValid) { //数据操作逻辑 //code... switch (entity.ObjType) { case (int)ObjectType.User: return RedirectToAction("Index", "User", new { id = entity.ObjID }); case (int)ObjectType.Product: return RedirectToAction("Index", "Product", new { id = entity.ObjID }); case (int)ObjectType.Order: return RedirectToAction("Index", "Order", new { id = entity.ObjID }); default: break; } } else ModelState.AddModelError("", "请认真填写..."); return View(); }
View的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.
回到目录
相关文章推荐
- 爱上MVC3系列~PartialView()与View()真的一样吗?
- 爱上MVC3系列~PartialView中的页面重定向
- 爱上MVC3系列~PartialView()与View()真的一样吗?
- 爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
- 爱上MVC3系列~使用视图模型的好处及与数据模型之间的赋值问题
- 爱上MVC3系列~手动向路由表扔数据,不影响当前URL路由配对
- EF5+MVC4系列(11)在主视图中用Html.RenderPartial调用分部视图(ViewDate传值);在主视图中按钮用ajax调用子action并在子action中使用return PartialView返回分布视图(return view ,return PartialView区别)
- 爱上MVC3系列~全局异常处理与异常日志
- 爱上MVC3系列~Razor模板页
- 爱上MVC3系列~Razor页面中的共享namespace不起作用了(解决自定义扩展方法不能识别的问题)
- 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
- MVC3 使用动态生成的DropDownList,更新partial view
- 爱上MVC3系列~分部视图中的POST
- 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
- 爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
- 开发框架模块视频系列(1)-公用类库介绍
- EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法