我一直在開發純粹的MVC CMS以獲得樂趣,並且遇到了煩人的ASP.NET路由錯誤/功能。在ASP.NET路由中擴展RouteCollection
每個動態 CMS中的託管頁面與從數據庫中提取的特定路由相關聯。這些在應用程序啓動時加載。當用戶添加新頁面或編輯現有頁面的Url時,我需要能夠編輯RouteTable以相應地插入/編輯路由。
問題是,新路由不需要簡單地添加到RouteCollection的末尾,而是可能需要插入到特定位置。似乎符合邏輯,只是RouteCollection僅包含從Collection<T>
繼承的標準Insert(int idx, RouteBase route)
方法,該方法不包含路由名稱。路由的名稱非常重要,因爲我始終使用它來生成操作鏈接。
看着反射器我看不到一個簡單的方法來擴展這個集合,因爲_namedMap字典被標記爲私有。我嘗試在插入點切入集合並重新添加每個項目,但是因爲沒有方法從RouteCollection中反向查找路由名稱,所以我無法用它們之前可能已有的名稱重新添加它們。太令人沮喪了!
爲什麼路線的名稱不是路線對象的屬性? 爲什麼如果MS認真對待我們擴展MVC和路由,他們會使關鍵類難以擴展?
對此處最佳解決方案有何建議?
編輯:
好吧,也許我本來應該很多很多清晰的在這裏。我不是在尋找對我的CMS設計的批評。我很欣賞這些評論,但這不是我所要求的。
簡化的問題。我如何在運行時將命名路線插入路線集合中?該類上的當前插入方法不足,因爲它不包含名稱。
乾杯,
伊恩
爲什麼你正確地將路由映射到託管頁面?您可能能夠簡化您的URL結構,以便您可以不斷重複使用獨立於託管頁面的相同路由。 – 2010-11-17 16:56:49
@Berin:啊,是的。我沒有想到這一點。每頁一條路線確實是一個糟糕的設計。應該使用現有路線中的參數值來識別頁面。 – 2010-11-17 17:00:54
我不是很清楚,例如我有一個託管的博客詳細信息頁面,其中包含post/{name}/{id}的url,我不必管理url解析。我有一個處理簡單的靜態URL的託管路由塊的結尾,所以它不是每頁一個路由,它的每個動態頁面+ 1的路由。我的問題依然存在。 – madcapnmckay 2010-11-17 17:32:59