探索 ASP.NET Futures_.Net教程
推薦:一個不被flash、select、activex遮擋的、跨frame的無限分級菜單一個不被flash、select、activex遮擋的、跨frame的無限分級菜單 該菜單改良自著名的chromemenu,可以無限分級,使用方法: 1、添加主菜單項 找到類似下面代碼的部分:
如果你在使用ASP.NET站點,同時又希望它Search Engine Friendly一些,很可能你就希望它有一個Sitemaps。在這里我們說的不是ASP.NET的SiteMap,而是Sitemaps.org定義的基于XML的Sitemaps協議,注意這兩個名字的大小寫以及單復數,之后我都會這樣區分它們。Sitemaps協議有點類似RSS或者Atom,只不過它描述的不是最近的內容更新,而是整個站點的地圖,主要用來描述特定URL的重要程度、更新時間及頻率等。搜索引擎如Google是支持Sitemaps的,通過Google Webmaster Tools(以前叫做Google Sitemaps)你可以提交你的站點的Sitemaps,以便Google更好地索引你的網站。
簡單調用
在ASP.NET Futures (May CTP)之前,如果你想要為你的ASP.NET站點增加Sitemaps支持,恐怕必須自己實現一個特殊的頁面(或者HttpHandler)用于讀取ASP.NET SiteMap并輸出為Sitemaps協議。而現在這工作可以交給ASP.NET Futures的AspNetSiteMapSearchSiteMapProvider來做了,你需要做的僅僅是在web.config中寫上幾句。由于這個功能屬于ASP.NET Futures中SearchSiteMap這個類別,所以需要在web.config中對該節進行配置:
以下為引用的內容: <microsoft.web.preview> |
在這個配置里面,我們啟用了SearchSiteMap,然后配置了一個名為"Navigation"的Provider,此Provider使用AspNetSiteMapSearchSiteMapProvider類,就這么簡單,和配置任何其他Provider的形式完全一致。之后你還需要確保一下有關的HttpHandler配置好了,如果你新建網站時使用的模板是ASP.NET Futures的,那么HttpHandler就應該配置好的了,配置信息如下:
以下為引用的內容: <add verb="*" path="SearchSiteMaps.axd" type="Microsoft.Web.Preview.Search.SearchSiteMapHandler" validate="True"/> |
這時候,如果你的網站已經正常啟用ASP.NET自身的SiteMap功能,例如使用靜態的Web.sitemap,那么訪問SearchSiteMap.axd就應該能看到按照Sitemaps協議輸出的結果。這時候或許你會很奇怪,為什么結果只有一條記錄呢?這就是Sitemaps的遞歸調用了,這個主Sitemaps僅僅聲名了我們之前配置的那個名為"Navigation"的Sitemaps的地址,也就是SearchSiteMaps.axd?sitemap=Navigation。打開這個地址,你會發現仍然是一個Sitemaps,它里面包含的就是ASP.NET SiteMap提供的數據了。
深入看看
接下來,我們用Reflector來看看Microsoft.Web.Preview.Search下面的一些類的實現方式。我不準備詳細分析代碼了,因為代碼都很簡單,直接說說看完的結果吧。如果你之前瀏覽根據SiteMap生成的Sitemaps時發現少了些東西,在這里你就知道如何把這些項目補充上去了。Sitemaps協議中關于一個URL能夠包括以下幾樣信息:
地址:也就是URL本身
最后更新時間
更新頻率:此URL的內容多久更新一次
重要程度:一個0到1的值,默認值為0.5,搜索引擎并不一定根據這個值來判斷URL的真正重要程度
然而自動生成的Sitemaps僅僅包括前兩項信息,如果我們需要后兩項信息就需要手動增加。怎樣手動增加呢?因為SiteMapNode類似于字典,能夠訪問this [string key],所以只要SiteMapNode[]存在"lastModified"/"changeFrequency"/"priority"這幾個值就能自動輸出到Sitemaps中,而且"lastModified"會覆蓋對應Page的aspx文件的真實最后更新時間。
簡單舉例說明這功能怎么用,假設你使用的是靜態的Web.sitemap,我們已經習慣這樣定義一個SiteMapNode:
以下為引用的內容: <siteMapNode url="Default.aspx" title="Welcome" description="" /> |
而增加特定的屬性只需要這樣定義:
以下為引用的內容: <siteMapNode url="Default.aspx" title="Welcome" description="" changeFrequency="daily" priority="0.8" /> |
支持Dynamic Data
上面說了那么多,也就僅僅能做到支持系統自帶的SiteMap,而實際上SearchSiteMap還能夠對Dynamic Data提供特殊的支持。Dynamic Data簡單易用,好像Ruby on Rails那樣支持scaffolding,預覽了ASP.NET將來在敏捷方面的發展。有關Dynamic Data Control的詳細信息,請參考Dflying的文章,我們這里僅討論SearchSiteMap的支持:
ASP.NET Futures初探——動態數據控件(Dynamic Data Control):入門
ASP.NET Futures初探——動態數據控件(Dynamic Data Control):深入一些
需要支持Dynamic Data的話,首先你要實現自己的DynamicDataSearchSiteMapProvider。大家不要一看到要繼承自系統類實現自己的類就覺得是非常復雜的事情,其實這里我們僅需要override掉一個函數,也就是DynamicDataSearchSiteMapProvider.DataQuery()。在這個函數中,我們需要返回一個IEnumerable,其中的元素需要具有主鍵列名屬性以及以下屬性:
以下為引用的內容: SiteMapLastModified SiteMapChangeFrequency SiteMapPriority |
你很可能會問,為什么要是不確定類型的IEnumerable而不是確定類型的List<>呢?想想.NET Framework的什么部分用IEnumerable用得最多吧,那就是LINQ。如果你在QueryData()中直接使用LINQ來篩選數據,你就不需要創建自定義類型并且自己填充IEnumerable了。況且,主鍵列名也不是確定的,如果用一個屬性記錄其名稱用另外一個屬性記錄其值那就很麻煩了,所以ASP.NET Futures選擇了上述充分發揮LINQ優勢的做法。
最后,我個人感覺SearchSiteMapProviderBase的設計有點問題,它作為AspNetSiteMapSearchSiteMapProvider與DynamicDataSearchSiteMapProvider的基類,其中包括QueryData()方法,然而此方法只有DynamicDataSearchSiteMapProvider用到,很顯然就應該將它放置到DynamicDataSearchSiteMapProvider里面。
分享:學習asp.net之SQL語句查詢效率和安全性看一看這段代碼,讓我們來看看主要存在的問題 以下為引用的內容: //設置SQL語句 insertstr="insert into userinf
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-探索 ASP.NET Futures。