爱上MVC3系列~将公用的模块提到PartialView

回到目录

事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象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的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.

回到目录

posted @ 2012-12-03 23:10  张占岭  阅读(1510)  评论(3编辑  收藏  举报