在發現這個小技巧之前,我經常被某些問題困擾,我們以博客園為例
1:是分類名稱
2:是分類url
3:點擊分類,進入的頁面,要顯示分類的名稱
4:點擊分類,進入的頁面,要用分類相關參數
在日常web的開發中,經常遇到要在頁面上顯示一個分類,然后這個分類的鏈接要包含這個分類的id等參數(例如為搜索引擎友好要包含名稱的漢語拼音),然后點擊這個分類的頁面要顯示這個分類的各種信息例如分類名稱,分類讀取搜索接口的地址和參數等。
尤其是某些變態的分類,一個條目和一個條目讀取相關信息的方式還不一樣,還可能很耗時
這個時候為了提升系統性能,經常用緩存辦法,尤其是整體高並發站點(不是某些熱數據造成的並發,而是網站整體的並發比較大),更是頭疼
我們按照web開發無限細分來看這個問題
1 直接讀取數據 ==》 數據庫連接數被占用
2 緩存到asp.net自帶的cache ==》我經常偷懶用這個,數據庫連接數被占用的次數減少但不明顯,因為緩存的時間短(緩存長了貌似沒用)
3緩存到分布式緩存例如Memcache ==》序列化和反序列化造成cpu上升和內網流量上升
3緩存到分布式緩存例如Memcache+本地cache緩存等 ==》方案較為復雜
直到最近寫route ,手抖了一下,以為自己寫錯了
假設 博客園的分類是這么定義的
public class CnblogsCate { public int id { get;set; } public string name { get; set; } public string search { get; set; } /* 其他相關的屬性 * */ public List<CnblogsCate> getALL() { List<CnblogsCate> result = new List<CnblogsCate>(); CnblogsCate item = new CnblogsCate(); item.id = 1; item.name = "test"; item.search = "pra=1"; result.Add(item); item = new CnblogsCate(); item.id = 2; item.name = "test2"; item.search = "pra=2"; result.Add(item); return result; //return new List<CnblogsCate> } }
注冊route
CnblogsCate Cate=new CnblogsCate(); var allCate= Cate.getALL(); foreach (CnblogsCate item in allCate) { routes.MapRoute( "Default_" + item.id, // 路由名稱 "Cnblog/"+item.name+"/", // 帶有參數的 URL new { controller = "Cnblogs", action = "Index", Cate = item } // 這里直接對參數賦值 ); }
這樣在控制器里面就可以直接取到想要的數據了
public class CnblogsController : Controller { // // GET: /Cnblogs/ public ActionResult Index(CnblogsCate Cate) { return View(); } }
例如
請求:http://localhost:34197/Cnblog/test/
這樣就可以和各種復雜的方案說拜拜了,即使是動態添加和刪除分類對應的rout也很簡單,和復雜方案說886