愛上MVC3系列~將(jiang)公用的模塊提(ti)到PartialView
事實(shi)(shi)(shi)是這(zhe)(zhe)(zhe)(zhe)樣(yang)的(de)(de)(de),這(zhe)(zhe)(zhe)(zhe)個項目它有(you)產品,用戶(hu)(hu),用戶(hu)(hu)要(yao)買產品,這(zhe)(zhe)(zhe)(zhe)時產生(sheng)了(le)訂單,而這(zhe)(zhe)(zhe)(zhe)三(san)個對象(xiang)(xiang)都有(you)被評論的(de)(de)(de)功(gong)能(neng),這(zhe)(zhe)(zhe)(zhe)時評論對象(xiang)(xiang)Review就產生(sheng)了(le),我(wo)(wo)(wo)們要(yao)設計一(yi)(yi)個視圖,它來實(shi)(shi)(shi)現對三(san)個對象(xiang)(xiang)的(de)(de)(de)評論功(gong)能(neng),沒(mei)有(you)人會希望同(tong)樣(yang)的(de)(de)(de)功(gong)能(neng)被重復的(de)(de)(de)開發,相同(tong)的(de)(de)(de)代碼出現的(de)(de)(de)不同(tong)的(de)(de)(de)地方,這(zhe)(zhe)(zhe)(zhe)當然也違背了(le)DRY原則,所以,我(wo)(wo)(wo)們需要(yao)抽(chou)象(xiang)(xiang),我(wo)(wo)(wo)們需要(yao)封裝,我(wo)(wo)(wo)們需要(yao)對問題進行面(mian)向對象(xiang)(xiang)的(de)(de)(de)分析. 第一(yi)(yi)部(bu):將對象(xiang)(xiang)抽(chou)象(xiang)(xiang)出來,找(zhao)來不變的(de)(de)(de)與變化的(de)(de)(de)屬性 product,user,order共同(tong)作用于reviews,我(wo)(wo)(wo)們來看(kan)一(yi)(yi)下(xia)review的(de)(de)(de)實(shi)(shi)(shi)體結構
1 /// <summary> 2 /// 評論(lun)對象 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 /// 被評論對象(xiang)的(de)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 /// 系統主要對象(xiang)的類(lei)型(xing) 3 /// </summary> 4 public enum ObjectType 5 { 6 User, 7 Product, 8 Order 9 }
而事實上(shang),除了(le)ObjType與ObjID之外,其它屬性對于三大對象來(lai)說都是(shi)相(xiang)同的,這時,我們(men)可(ke)給在設(she)計(ji)視圖時,將objtype與objid以參數的形式告(gao)訴review,代(dai)碼如下(xia):
1 /// <summary> 2 /// 評論(lun)公用視圖 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 }
最后通過提交(jiao)表單將(jiang)objid和objtype的(de)值(zhi)post到實體(ti)中(zhong),然后根據objtype來確實操作完成(cheng)后頁面所重定向的(de)地址. 代碼如下(xia):
1 [HttpPost] 2 public ActionResult Review(Review entity) 3 { 4 if (ModelState.IsValid) 5 { 6 //數據操(cao)作(zuo)邏輯 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("", "請認真(zhen)填(tian)寫..."); 22 return View(); 23 }
View的(de)(de)代碼就不(bu)在這(zhe)里展示(shi)了(le)(le),事(shi)實上,我(wo)的(de)(de)目的(de)(de)不(bu)是(shi)(shi)代碼,不(bu)是(shi)(shi)業務(wu),而是(shi)(shi)面(mian)(mian)向對象(xiang)的(de)(de)思想(xiang),通過這(zhe)個(ge)業務(wu),而我(wo)自己(ji)對面(mian)(mian)向對象(xiang)有(you)(you)了(le)(le)新的(de)(de)認識(shi),有(you)(you)時(shi)解決問題的(de)(de)方法(fa)(fa)可能有(you)(you)很多,但我(wo)們是(shi)(shi)否(fou)(fou)找到(dao)(dao)的(de)(de)最佳(jia)的(de)(de)方法(fa)(fa)呢(ni)? 有(you)(you)時(shi),我(wo)們在重復的(de)(de)做一件事(shi),但是(shi)(shi)否(fou)(fou)自己(ji)意識(shi)到(dao)(dao)了(le)(le)呢(ni)?又是(shi)(shi)否(fou)(fou)意識(shi)到(dao)(dao)了(le)(le)而去主動尋找更好的(de)(de)方法(fa)(fa)呢(ni)?這(zhe)些,我(wo)希望大家的(de)(de)回答都是(shi)(shi)"是(shi)(shi),我(wo)做到(dao)(dao)了(le)(le)",呵(he)呵(he).祝您晚安.