事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象Review就产生了,我们要设计一个视图,它来实现对三个对象的评论功能,没有人会希望同样的功能被重复的开发,相同的代码出现的不同的地方,这当然也违背了DRY原则,所以,我们需要抽象,我们需要封装,我们需要对问题进行面向对象的分析. 第一部:将对象抽象出来,找来不变的与变化的属性 product,user,order共同作用于reviews,我们来看一下review的实体结构
1 /// <summary> 2 /// 评论对象 3 /// </summary> 4 public class Review 5 { 6 public long ID { get; set; } 7 /// <summary> 8 /// 被评论对象的类型 9 /// </summary> 10 public int ObjType { get; set; } 11 /// <summary> 12 /// 被评论对象的ID 13 /// </summary> 14 public long ObjID { get; set; } 15 [Required] 16 public string Title { get; set; } 17 [Required] 18 public string Content { get; set; } 19 [Required] 20 public DateTime CreateDate { get; set; } 21 }
1 /// <summary> 2 /// 系统主要对象的类型 3 /// </summary> 4 public enum ObjectType 5 { 6 User, 7 Product, 8 Order 9 }
而事实上,除了ObjType与ObjID之外,其它属性对于三大对象来说都是相同的,这时,我们可给在设计视图时,将objtype与objid以参数的形式告诉review,代码如下:
1 /// <summary> 2 /// 评论公用视图 3 /// </summary> 4 /// <returns></returns> 5 public ActionResult Review(int? objID, int? objType) 6 { 7 return View(new Review 8 { 9 ObjID = objID ?? 0, 10 ObjType = objType ?? 1, 11 Content = "", 12 Title = "", 13 }); 14 }
最后通过提交表单将objid和objtype的值post到实体中,然后根据objtype来确实操作完成后页面所重定向的地址. 代码如下:
1 [HttpPost] 2 public ActionResult Review(Review entity) 3 { 4 if (ModelState.IsValid) 5 { 6 //数据操作逻辑 7 //code... 8 switch (entity.ObjType) 9 { 10 case (int)ObjectType.User: 11 return RedirectToAction("Index", "User", new { id = entity.ObjID }); 12 case (int)ObjectType.Product: 13 return RedirectToAction("Index", "Product", new { id = entity.ObjID }); 14 case (int)ObjectType.Order: 15 return RedirectToAction("Index", "Order", new { id = entity.ObjID }); 16 default: 17 break; 18 } 19 } 20 else 21 ModelState.AddModelError("", "请认真填写..."); 22 return View(); 23 }
View的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.
本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC3系列~将公用的模块提到PartialView,如需转载请自行联系原博主。