在發現這個小技巧之前,我經常被某些問題困擾,我們以博客園為例
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


