事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象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