隨筆 - 30, 文章 - 0, 評(píng)論 - 9, 引用 - 0
          數(shù)據(jù)加載中……

          2006年11月8日

          提高網(wǎng)站在Google中的排名 ——面向搜索引擎的網(wǎng)站設(shè)計(jì)

          Google排名優(yōu)化-面向搜索引擎的網(wǎng)站設(shè)計(jì)


          內(nèi)容摘要:
          目前中文網(wǎng)站在整個(gè)互聯(lián)網(wǎng)中的影響還比較小,這主要是由于中文網(wǎng)站總體的水平(技術(shù)上,內(nèi)容上)都還相對(duì)落后造成的,最主要的表現(xiàn)有:

          1. 行業(yè)知識(shí):不知道搜索引擎對(duì)吸引的新用戶的重要性,在搜索引擎排名服務(wù)中追求“傻瓜相關(guān)”,購買一些其實(shí)沒有太多實(shí)際意義的行業(yè)關(guān)鍵詞。其實(shí)能夠用戶輸入的關(guān)鍵詞越多,其目標(biāo)性越強(qiáng),這樣的客戶價(jià)值越高。用戶能夠直接定位到產(chǎn)品具體內(nèi)容頁比到網(wǎng)站首頁有價(jià)值的多;
          2. 發(fā)布技術(shù):網(wǎng)站的網(wǎng)頁進(jìn)入Google的索引量非常小,主要是由于大量使用動(dòng)態(tài)網(wǎng)頁造成的。需要將動(dòng)態(tài)頁面鏈接改寫成靜態(tài)鏈接
          3. 頁面設(shè)計(jì):頁面標(biāo)題重復(fù),關(guān)鍵詞不突出,過渡使用JavaScript腳本/圖片/Flash等不適合搜索引擎索引的非文本形式;
          而以上這些問題的根本原因還是網(wǎng)站自身缺乏日志統(tǒng)計(jì)分析造成:因此無法看到SEO對(duì)網(wǎng)站自身產(chǎn)生的巨大影響。

          SEO的目的是通過一些簡單的策略,讓網(wǎng)站自身的水平在互聯(lián)網(wǎng)中有一個(gè)真實(shí)的體現(xiàn)。
          網(wǎng)站結(jié)構(gòu)設(shè)計(jì)中面向搜索引擎的優(yōu)化注意事項(xiàng)包括:

          (注意:本網(wǎng)站設(shè)計(jì)本身就利用了其中一些方法)。

          什么是PageRank

          Google等新一帶搜索引擎的優(yōu)勢(shì)之一在于不僅索引量很大,而且還將最好的結(jié)果排在搜索結(jié)果的最前面,具體的原理可以參考Google の秘密 - PageRank 徹底解説一文,PageRank簡單的說類似于科技論文中的引用機(jī)制:誰的論文被引用次數(shù)多,誰就是權(quán)威。在互聯(lián)網(wǎng)上PageRank就是基于網(wǎng)頁中相互鏈接關(guān)系的分析得出的。

          此外,從計(jì)算方法角度闡述PageRank機(jī)制還有這篇文章:http://pr.efactory.de/里面有更詳細(xì)的PageRank算法說明和各種清晰的小型個(gè)案分析:

          比如:子頁中導(dǎo)航條的重要性
          B <=> A => C  
          Vs  
          B <=> A <=> C   (好)

          頁面數(shù)量因素:
          B <=> A <=> C
          Vs
          F <=\   /=> G
          B <=> A <=> C   (好)
          D <=/   \=> E

          一個(gè)意想不到的結(jié)論:
          (B <=> A <=> C)      ( E <=> D <=> F)
          Vs
          (B <=> A <=> C)  <=> ( E <=> D <=> F)
          PageRank升高的只是被鏈接的2個(gè)首頁A和D,而網(wǎng)站子頁面的PageRank平均會(huì)略有下降。同時(shí):一個(gè)網(wǎng)站進(jìn)入Google的索引量越大其受類似因素影響越小。
          PageRank不對(duì)稱的頁面互鏈:
          Google會(huì)用BadRank之類的算法進(jìn)行糾正,而且一個(gè)網(wǎng)頁著有來自“與其自身不相稱”的高PageRank站點(diǎn)的鏈接,而自身又缺少足夠數(shù)量和質(zhì)量的反相鏈接的話,其PageRank會(huì)自動(dòng)降低為0,A(pr=7) <=> B(pr=0)
          簡單的說就是:偶爾要被權(quán)威站點(diǎn)反相鏈接不算數(shù),要被足夠多的權(quán)威站點(diǎn)引用才能提高自身網(wǎng)頁的PageRank。
          Web超鏈分析算法綜述(南京大學(xué)論文) 更多論文可以通過搜索:“filetype:pdf google pagerank anchor text bayesian”得到

          鏈接就是一切

          在互聯(lián)網(wǎng)的海洋中,最重要的就是互聯(lián)互通,不被其他網(wǎng)站引用的網(wǎng)站就是“信息孤島”。“酒好也怕藏的深”,也許這話說起來有點(diǎn)像垃圾郵件廣告,但事實(shí)就是這樣。所以如果做網(wǎng)站的目的不是孤芳自賞,就需要積極的推廣自己的網(wǎng)站。
          通過搜索引擎推廣自己需要注意以下幾個(gè)方面:

          1. 以量取勝:不一定加入傳統(tǒng)門戶網(wǎng)站的分類目錄才是網(wǎng)站推廣,來自其他網(wǎng)站的任何反相鏈接都是有用的
            網(wǎng)站推廣比較經(jīng)典的方式就是加入比較大型門戶網(wǎng)站的分類目錄,比如:Yahoo!dmoz.org等。其實(shí)這里有一個(gè)誤區(qū):不一定非要加入大型網(wǎng)站的分類目錄才是網(wǎng)站推廣,因?yàn)楝F(xiàn)在搜索引擎已經(jīng)不再只是網(wǎng)站目錄的索引,而是更全面的網(wǎng)頁索引,所以無論來自其他網(wǎng)站任何地方的反相鏈接都是非常有價(jià)值的,哪怕是出現(xiàn)在新聞報(bào)道,論壇,郵件列表歸檔中。Blogger(Weblog的簡稱)們也許最深刻地理解了“鏈接就是一切”這句話的含義,由于Blog的內(nèi)容之間有大量的相互鏈接(他們之間利用RSS很容易進(jìn)行鏈接大量傳播),因此最經(jīng)常被引用的Blog頁面在搜索引擎中的排名往往比一些大型商業(yè)網(wǎng)站的頁面還要高。而WIKI這樣的文檔管理系統(tǒng)更加突出了良好結(jié)構(gòu),良好引用的特征。而目前很多網(wǎng)站通過在各種WIKI/留言簿中灌注垃圾留言的方法,這種方式是非常不可取的。這種鏈接不穩(wěn)定:
          2. 以質(zhì)取勝:被PageRank高的網(wǎng)站引用能更快地提高PageRank
            數(shù)量只是關(guān)鍵因素之一,來自PageRank高的頁面的鏈接還能更快的提高被鏈接目標(biāo)的PageRank,我只是將一些文章投稿在了ZDNet中國上,由于頁面上有文章出處鏈接,相應(yīng)網(wǎng)頁和網(wǎng)站整體的PageRank過了一段時(shí)間后就有了很大的提升。有時(shí)候被什么樣的網(wǎng)站引用有時(shí)候比引用次數(shù)多更重要。這里我要特別感謝的是,當(dāng)時(shí)ZDNet中國是唯一遵循了我的版權(quán)聲明的要求表明了文章出處,并且有反相鏈接的網(wǎng)站。
            按照這個(gè)原則:能夠名列Yahoo!和DMOZ這樣的大型權(quán)威目錄的頭2層是非常有價(jià)值的。
          3. 了解搜索引擎的"價(jià)值觀":
            Lucene簡介這篇文章被Jakarta.apache.org的lucene項(xiàng)目引用以后,這篇文章就成為了所有頁面中PageRank最高的頁面,而Google支持的一些項(xiàng)目,比如:Folding@Home,讓我一直懷疑他們對(duì)政府,教育和非盈利組織的站點(diǎn)有特別加分,畢竟.org .edu才代表了互聯(lián)網(wǎng)的實(shí)質(zhì):分權(quán)和共享。
            但更合理的解釋是:.org很多都是開放技術(shù)平臺(tái)的開發(fā)者,他們會(huì)在首頁這樣的地方加入Powered By Apache, Power by FreeBSD之類的鏈接表示對(duì)其他開源平臺(tái)的尊重,所以象Apache, PHP, FreeBSD這樣的開源站點(diǎn)在GOOGLE中都有非常高的PageRank。而在.edu這些站點(diǎn)中,很多都是學(xué)術(shù)性比較強(qiáng)的文檔,以超鏈接形式標(biāo)明參考文獻(xiàn)的出處已經(jīng)成為一種習(xí)慣,而這也無疑正是PageRank最好的依據(jù)。
            注意:不要通過Link Farm提高自身的站點(diǎn)排名:Google會(huì)懲罰那些主動(dòng)鏈接到Link Farm站點(diǎn)以提高自身排名站點(diǎn),相應(yīng)站點(diǎn)的頁面將不會(huì)被收入到索引中。但如果你的頁面被別的Link Farm鏈接了也不必?fù)?dān)心,因?yàn)檫@種被動(dòng)的鏈接是不會(huì)被懲罰的。
          4. 不要吝嗇給其他網(wǎng)站的鏈接:如果一個(gè)網(wǎng)頁只有大量的進(jìn)入鏈接,而缺乏導(dǎo)出鏈接,也會(huì)被搜索引擎認(rèn)為是沒有價(jià)值的站點(diǎn)。保證你的網(wǎng)站能夠幫助搜索引擎更準(zhǔn)確地判斷哪些是對(duì)用戶最有價(jià)值的信息,也就是說如果你的網(wǎng)站只有外部反向鏈接而沒有導(dǎo)出鏈接的話,也會(huì)對(duì)你的網(wǎng)站在搜索結(jié)果中的表現(xiàn)帶來負(fù)面影響。當(dāng)然網(wǎng)站中連一個(gè)導(dǎo)出鏈接都沒有的情況非常罕見,除非你是刻意這么做。正常情況下大家都會(huì)自然地在網(wǎng)頁中加上一些其他網(wǎng)站的鏈接,帶領(lǐng)訪問者去到我們認(rèn)為重要或能夠提供更多有價(jià)值信息的地方,

          另外在推廣自己網(wǎng)站之前也許首先需要了解自己網(wǎng)站目前在一些搜索引擎中的知名度,原理非常簡單,可以參考如何評(píng)價(jià)網(wǎng)站的人氣一文。

          網(wǎng)站推廣只是手段,如何突出內(nèi)容、讓需要相關(guān)信息的用戶能夠盡快的找到你的網(wǎng)站才是目的,PageRank高并不代表像Yahoo!這樣的門戶站點(diǎn)就能在所有搜索結(jié)果中排名靠前,因?yàn)樗阉饕娴慕Y(jié)果是搜索關(guān)鍵詞在頁面中的匹配度和頁面的PageRank相結(jié)合的排名結(jié)果。因此第二個(gè)要點(diǎn):如何突出關(guān)鍵詞。

          如何突出關(guān)鍵詞:面向主題(Theme)的關(guān)鍵詞匹配

          1.  Theme Engine正在逐步超過PR,成為結(jié)果排序中更主要的因素,可以比較一下以下現(xiàn)象:
            • 為什么查“新聞”,“汽車”之類的文字,各種門戶網(wǎng)站的首頁不在第一位?要知道他們的頁面中都有相應(yīng)頻道的鏈接文字的
            • 一篇新聞頁面中,搜索引擎如何不通過模板匹配,自動(dòng)將新聞的主體和頁面中的頁頭,欄目導(dǎo)航條,頁尾等部分的內(nèi)容區(qū)分開的?
            其實(shí)以上問題都可以歸結(jié)為網(wǎng)頁內(nèi)容摘要的提取策略和關(guān)鍵詞在其中的命中:
            首先將能夠描述一個(gè)頁面內(nèi)容的分成以下幾種類型:
            1. 鏈入文字描述:inbound link text
              http://www.searchenginedictionary.com/terms-inbound-link.shtml
            2. HTML頁面標(biāo)題:title 好標(biāo)題一般會(huì)將頁面中最重要的關(guān)鍵詞放在最前面,比如:ABC-10型吸塵器 - XX家電城
            3. HTML內(nèi)容主體:content text
            4. 鏈出文字:outbound link text
            如果按照以下規(guī)則:
            一個(gè)頁面中關(guān)鍵詞命中權(quán)重:鏈入文字 > HTML標(biāo)題文字 > HTML頁面主體內(nèi)容 >> 出鏈文字,以上現(xiàn)象就比較好解釋了。
            鏈入文字是頁面上看不見的,但鏈入文字對(duì)被鏈接頁面有巨大的作用:在現(xiàn)代搜索引擎在關(guān)鍵詞匹配的過程中,匹配的過程不只看當(dāng)前頁面的內(nèi)容摘要:很大程度上,不只看這個(gè)網(wǎng)頁自己說自己有什么內(nèi)容,還要看別人如何鏈接時(shí),如何描述你的網(wǎng)站別人怎么稱呼你,比你自己說自己更重要。。
            比如查:“世界衛(wèi)生組織”,返回結(jié)果中有 http://www.who.int/ 而這個(gè)頁面中是沒有中文的,之所以能匹配上,是因?yàn)楹芏噫溄铀闹形木W(wǎng)站使用了:<a >世界衛(wèi)生組織</a>,所以,這個(gè)頁面中不存在的中文關(guān)鍵詞也成為了頁面摘要的一部分。這樣一想,就可以知道鏈出鏈接的文字其實(shí)是為被鏈接的子頻道首頁或者內(nèi)容詳情頁服務(wù)的。對(duì)自身頁面的關(guān)鍵詞密度只有負(fù)面的影響,這也是Google建議一個(gè)頁面中鏈接不要超過100個(gè)的原因:他根本不索引100個(gè)鏈接以后的內(nèi)容。按照以上規(guī)則,搜索引擎將一篇新聞詳情頁中的新聞內(nèi)容提取出來就是把頁面上所有帶HTTP鏈接的文字都去掉,就是新聞的內(nèi)容部分了,更精確一些可以通過取最長文本段落等策略實(shí)現(xiàn);而很多網(wǎng)站首頁或頻道首頁中幾乎全部都是鏈接,經(jīng)過搜索引擎分析的結(jié)果就是:什么內(nèi)容也沒有,能夠被命中的關(guān)鍵詞僅僅是別人鏈接你用的“網(wǎng)站首頁”和頻道標(biāo)題Title中的站點(diǎn)名稱等的幾個(gè)關(guān)鍵詞,而頁面中其他的文字則遠(yuǎn)遠(yuǎn)不如相應(yīng)子頻道和具體內(nèi)容頁面的匹配度高,而搜索引擎能夠通過以上規(guī)則,讓用戶更快的直接定位到有具體內(nèi)容的內(nèi)容詳情頁面。因此希望通過一個(gè)首頁,盡可能多的命中所有希望推廣的關(guān)鍵詞是不可能的。讓網(wǎng)頁盡可能多的進(jìn)入搜索引擎的索引,然后把握好整個(gè)網(wǎng)站的主題風(fēng)格是非常重要的,讓網(wǎng)站的主題關(guān)鍵詞能夠比較均勻的按照金字塔模式分布到網(wǎng)站中可以參考:網(wǎng)站的主題金字塔設(shè)計(jì)          網(wǎng)站名稱(用戶通過1-2個(gè)抽象關(guān)鍵詞)
                     /       \
                子頻道1   子頻道2 (用戶通過2-3個(gè)關(guān)鍵詞命中)
               /    \      /    \
            產(chǎn)品1  產(chǎn)品2 文章1 文章2 (用戶通過3-4個(gè)關(guān)鍵詞命中:這種用戶最有價(jià)值)

          2. 不要空著標(biāo)題:空著<title></title>無異于浪費(fèi)了最有價(jià)值的一塊陣地;
            不要使用meta keywords/description
            傳統(tǒng)的頁面中,HTML頁面中會(huì)有類似以下的隱含信息,用于說明當(dāng)前網(wǎng)頁的主要內(nèi)容關(guān)鍵字:
            <header>
                <meta name="keyword" content="mp3 download music...">
            </header>
            后來由于這種人工添加關(guān)鍵詞的方式被濫用,大量網(wǎng)頁中為了提高被搜索引擎命中的概率,經(jīng)常添加一些和實(shí)際網(wǎng)頁內(nèi)容無關(guān)的熱門關(guān)鍵比如:“music mp3 download”等,所以新一代的搜索引擎已經(jīng)不再關(guān)心頁面頭文件中的人工meta keyword聲明,而頁面標(biāo)題在搜索引擎的關(guān)鍵詞的命中命中過程中往往有著更高的比重,如果一個(gè)關(guān)鍵詞在標(biāo)題中命中會(huì)比在頁面中命中有更高的得分,從而在相應(yīng)的搜索結(jié)果排名中更靠前。
          3. 標(biāo)題長度和內(nèi)容:不要過長,一般在40個(gè)字(80個(gè)字節(jié))以內(nèi),并充分突出關(guān)鍵詞的比重;
            如果更長的標(biāo)題搜索引擎一般會(huì)忽略掉,所以要盡可能將主要關(guān)鍵詞放在標(biāo)題靠前的位置。省略掉不必要的形容詞吧,畢竟用戶主要通過名詞來找到需要的內(nèi)容。標(biāo)題內(nèi)容:盡量用一些別人可以通過關(guān)鍵詞找到的字眼(也別太過頭,如果標(biāo)題中的字眼超過1半內(nèi)容中都沒有,有可能被搜索引擎排除出索引),因此基于web日志中來自其他搜索引擎的關(guān)鍵詞查詢統(tǒng)計(jì)非常必要。
          4. 如果網(wǎng)頁很多的話,盡量使用不同的網(wǎng)頁標(biāo)題,爭取讓自己網(wǎng)站的內(nèi)容更多的進(jìn)入搜索引擎索引范圍;
            因?yàn)樗阉饕鏁?huì)根據(jù)頁面內(nèi)容的相似度把一些內(nèi)容當(dāng)成重復(fù)頁面排除出索引范圍;
            http://www.chedong.com/phpMan.php是我的網(wǎng)站上的一個(gè)小應(yīng)用:一個(gè)web界面的unix命令手冊(cè)(man page),在以前的設(shè)計(jì)中所有動(dòng)態(tài)頁面使用的都是同樣的標(biāo)題:"phpMan: man page /perldoc /info page web interface" ,Google索引了大約3000多個(gè)頁面,后來我將頁面標(biāo)題改成了"phpMan:  [命令名]"這樣的格式,比如:"phpMan: ls",這樣大部分動(dòng)態(tài)頁面的標(biāo)題就都不一樣了,一個(gè)月后Google從這個(gè)頁面入口索引了大約6000個(gè)頁面。因此,如果網(wǎng)站中很多網(wǎng)頁都使用相同的標(biāo)題,比如:“新聞?lì)l道”,“論壇”,這些頁面中很大一部分就會(huì)被排重機(jī)制忽略掉。
          5. 除了<title></title>外,還可以用<h1></h1>標(biāo)題行突出內(nèi)容主題,加強(qiáng)標(biāo)題的效果;
            在我的網(wǎng)站設(shè)計(jì)中:我會(huì)把用<h1>[標(biāo)題]</h1>這樣的模板把標(biāo)題突出顯示,而不是通過改變字體的方式突出標(biāo)題。

          其他網(wǎng)站設(shè)計(jì)提示

          1. 靜態(tài)鏈接:Blog網(wǎng)站另外一個(gè)優(yōu)勢(shì)在于其網(wǎng)頁是靜態(tài)鏈接:動(dòng)態(tài)網(wǎng)頁占到整個(gè)互聯(lián)網(wǎng)內(nèi)容的90%以上。各個(gè)搜索引擎其實(shí)能夠表現(xiàn)的都只不過是互聯(lián)網(wǎng)的冰山一角(3-5%),不同的只是誰讓優(yōu)質(zhì)網(wǎng)頁排名靠前的策略更優(yōu)秀而已:大部分搜索引擎都認(rèn)為靜態(tài)鏈接的網(wǎng)頁是優(yōu)質(zhì)網(wǎng)頁,Google在優(yōu)先抓取索引的網(wǎng)頁中70%以上是不帶參數(shù)鏈接的靜態(tài)網(wǎng)頁。而且即使同樣的內(nèi)容,靜態(tài)網(wǎng)頁也會(huì)比動(dòng)態(tài)網(wǎng)頁權(quán)重高:很容易理解:query?a=1&b=2這樣的鏈接由于參數(shù)順序顛倒的query?b=2&a=1完全相同。盡量使用靜態(tài)網(wǎng)頁:目前能夠動(dòng)態(tài)網(wǎng)頁進(jìn)行全面的索引還比較難,而即使是Google也更不會(huì)索引所有的內(nèi)容,因此很少會(huì)對(duì)參數(shù)超過2個(gè)的動(dòng)態(tài)網(wǎng)頁進(jìn)行進(jìn)一步的抓取和分析。以下是一個(gè)phpBB論壇頁面返回的HTTP頭信息:
            HTTP/1.1 200 OK
                Date: Wed, 28 Jan 2004 12:58:54 GMT
                Server: Apache/1.3.29 (Unix) mod_gzip/1.3.26.1a PHP/4.3.4
                X-Powered-By: PHP/4.3.4
                Set-Cookie: phpBB_data=a%3A0%3A%7B%7D; expires=Thu, 27-Jan-2005 12:58:54 GMT; path=/;
                Set-Cookie: phpBB_sid=09f67a83ee108ecbf11e35bb6f36fcec; path=/;
                Content-Encoding: gzip
                Cache-Control: private, pre-check=0, post-check=0, max-age=0
                Expires: 0
                Pragma: no-cache
                Connection: close
                Content-Type: text/html
                
            為了避免隱私問題:Googlebot可以通過對(duì)頁面http header中的session id和session cookie進(jìn)行一些甄別,這樣很多需要認(rèn)證信息的論壇內(nèi)容就無法進(jìn)入索引了。
            總體上說Google喜歡新的,靜態(tài)的內(nèi)容。因此無論從效率上講還是方便搜索引擎收錄:使用內(nèi)容發(fā)布系統(tǒng)將網(wǎng)站內(nèi)容發(fā)布成靜態(tài)網(wǎng)頁都是非常必要的,從某種程度上說google friendly = anonymous cache friendly。
            比如:http://www.chedong.com/phpMan.php/man/intro/3
            比http://www.chedong.com/phpMan.php?mode=man&parameter=intro&section=3這樣的鏈接更容易進(jìn)入搜索引擎的索引。而且在URL中的命中也能突出關(guān)鍵詞。
          2. 能夠進(jìn)入Google索引的頁面數(shù)量越多越好。用類似以下的腳本可以統(tǒng)計(jì)自己的網(wǎng)站被搜索引擎索引的情況。
            #!/bin/sh
                YESTERDAY=`date -d yesterday +%Y%m%d`
                # for FreeBSD: YESTERDAY=`date -v-1d +%Y%m%d`
                LOG_FILE='/home/apache/logs/access_log'
                grep -i Googlebot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.googlebot.txt
                grep -i baiduspider $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.baiduspider.txt
                grep -i msnbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.msnbot.txt
                grep -i inktomi $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.inktomi.txt
                grep -i openbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort |uniq -c | sort -rn > spider/$YESTERDAY.openbot.txt
                
          3. 網(wǎng)站目錄結(jié)構(gòu)要扁平,因?yàn)槊可钜患?jí)目錄,PAGERANK降低1-2個(gè)檔次。假設(shè)首頁是3,其子可能目錄就是1了,更深可能就無法列入評(píng)級(jí)范圍了。
          4. 表現(xiàn)和內(nèi)容的分離:“綠色”網(wǎng)頁
            網(wǎng)頁中的javascript和css盡可能和網(wǎng)頁分離,一方面提高代碼重用度(也方便頁面緩存),另外一方面,由于有效內(nèi)容占網(wǎng)頁長度的百分比高,也能提高相關(guān)關(guān)鍵詞在頁面中的比重也增加了。總之,應(yīng)該鼓勵(lì)遵循w3c的規(guī)范,使用更規(guī)范的XHTML和XML作為顯示格式便于內(nèi)容更長時(shí)間的保存。
          5. 讓所有的頁面都有能夠快速入口:站點(diǎn)地圖,方便網(wǎng)頁爬蟲(spider)快速遍歷網(wǎng)站所有需要發(fā)布的內(nèi)容。如果首頁就是用Flash或圖片進(jìn)入的話,無異于將搜索引擎拒之門外,除了UI設(shè)計(jì)的用戶友好外,spider friendly也是非常重要的。
          6. 保持網(wǎng)站自身的健康:經(jīng)常利用壞鏈檢查工具檢查網(wǎng)站中是否有死鏈。
          7. 保持網(wǎng)頁內(nèi)容/鏈接的穩(wěn)定性和持久性:在搜索引擎索引中網(wǎng)頁存在的歷史也是一個(gè)比較重要的因素,而且歷史比較久的網(wǎng)頁被鏈接的幾率越高。為了保證自己網(wǎng)頁能夠被比較持久的被其他網(wǎng)站的頁面引用,如果自己網(wǎng)頁中有鏈接更新時(shí),最好能保留舊的頁面并做好鏈接轉(zhuǎn)向,以保持內(nèi)容的連續(xù)性。要知道,把一個(gè)網(wǎng)站和內(nèi)容在搜索引擎中的排名“培養(yǎng)”的很高是一件非常不容易的事情,誰都不希望好不容易自己的內(nèi)容被別人找到了,點(diǎn)擊卻是“404 頁面不存在”吧,因此站點(diǎn)管理員對(duì)自身站點(diǎn)error.log的分析也是非常必要的。
          8. 文件類型因素:Google有對(duì)PDF, Word(Power Point, Excel), PS文檔的索引能力,由于這種文檔的內(nèi)容比一般的HTML經(jīng)過了更多的整理,學(xué)術(shù)價(jià)值一般比較高,所以這些類型的文檔天生就比一般的HTML類型的文檔 PageRank要高。因此,對(duì)于比較重要的文檔:技術(shù)白皮書,F(xiàn)AQ,安裝文檔等建議使用PDF PS等高級(jí)格式存取,這樣在搜索結(jié)果中也能獲得比較靠前的位置。
          9. 常常能發(fā)現(xiàn)門戶站點(diǎn)的一條新聞往往比其他站點(diǎn)的首頁排名還要靠前。因此一個(gè)站點(diǎn)總體PageRank提高了以后,往往自身一些并不重要的內(nèi)容也會(huì)被同那些高PageRank的內(nèi)容一起帶入被搜索引擎優(yōu)先查詢的列表中。這樣經(jīng)常造成很多大的開發(fā)站點(diǎn)的郵件列表歸檔往往比其他站點(diǎn)的首頁P(yáng)ageRank還要高。

          知己知彼——站點(diǎn)訪問統(tǒng)計(jì)/日志分析挖掘的重要性

          網(wǎng)站設(shè)計(jì)不僅僅只是被動(dòng)的迎合搜索引擎的索引,更重要是充分利用搜索引擎帶來的流量進(jìn)行更深層次的用戶行為分析。目前,來自搜索引擎關(guān)鍵詞統(tǒng)計(jì)幾乎是各種WEB日志分析工具的標(biāo)準(zhǔn)功能,相信商業(yè)日志統(tǒng)計(jì)工具在這方面應(yīng)該會(huì)有更強(qiáng)化的實(shí)現(xiàn)。WEB日志統(tǒng)計(jì)這個(gè)功能如此重要,以至于新的RedHat 8中已經(jīng)將日志分析工具webalizer作為標(biāo)準(zhǔn)的服務(wù)器配置應(yīng)用之一。

          以Apache/webalizer為例,具體的做法如下:
          1. 記錄訪問來源:
            在Apache配置文件中設(shè)置日志格式為combined格式,這樣的日志中會(huì)包含擴(kuò)展信息:其中有一個(gè)字段就是相應(yīng)訪問的轉(zhuǎn)向來源: HTTP_REFERER,如果用戶是從某個(gè)搜索引擎的搜索結(jié)果中找到了你的網(wǎng)頁并點(diǎn)擊過來,日志中記錄的HTTP_REFERER就是用戶在搜索引擎結(jié)果頁面的URL,這個(gè)URL中包含了用戶查詢的關(guān)鍵詞。
          2. 在webalizer中缺省配置針對(duì)搜索引擎的統(tǒng)計(jì):如何提取HTTP_REFERER中的關(guān)鍵詞
            webalizer中缺省有針對(duì)yahoo, google等國際流行搜索引擎的查詢格式:這里我增加了針對(duì)國內(nèi)門戶站點(diǎn)的搜索引擎參數(shù)設(shè)置
            SearchEngine yahoo.com p=
            SearchEngine altavista.com q=
            SearchEngine google.com q=
            SearchEngine    sina.com.cn word=
            SearchEngine    baidu.com   word=
            SearchEngine    sohu.com    word=
            SearchEngine    163.com q=

          通過這樣設(shè)置webalizer統(tǒng)計(jì)時(shí)就會(huì)將HTTP_REFERER中來自搜索引擎的URL中的keyword提取出來,比如:所有來自 google.com鏈接中,參數(shù)q的值都將被作為關(guān)鍵詞統(tǒng)計(jì)下來:,從匯總統(tǒng)計(jì)結(jié)果中,就可以發(fā)現(xiàn)用戶是根據(jù)什么關(guān)鍵詞找到你的次數(shù),以及找到你的用戶最感興趣的是那些關(guān)鍵詞等,進(jìn)一步的,在webalizer中有設(shè)置還可以將統(tǒng)計(jì)結(jié)果倒出成CSV格式的日志,便于以后導(dǎo)入數(shù)據(jù)庫進(jìn)行歷史統(tǒng)計(jì),做更深層次的數(shù)據(jù)挖掘等。

          以前通過WEB日志的用戶分析主要是簡單的基于日志中的訪問時(shí)間/IP地址來源等,很明顯,基于搜索引擎關(guān)鍵詞的統(tǒng)計(jì)能得到的分析結(jié)果更豐富、更直觀。因此,搜索引擎服務(wù)的潛在商業(yè)價(jià)值幾乎是不言而喻的,也許這也是Yahoo! Altavista等傳統(tǒng)搜索引擎網(wǎng)站在門戶模式后重新開始重視搜索引擎市場(chǎng)的原因,看看Google的年度關(guān)鍵詞統(tǒng)計(jì)就知道了,在互聯(lián)網(wǎng)上有誰比搜索引擎更了解用戶對(duì)什么更感興趣呢?

          請(qǐng)看本站的反相鏈接統(tǒng)計(jì):http://www.chedong.com/log/2003_6.log
          需要注意的是:由于Google針對(duì)Windows 2000中的IE使用的是UTF-8方式的編碼,因此很多統(tǒng)計(jì)有時(shí)候需要在UTF-8方式下查看才是正確字符顯示。從統(tǒng)計(jì)中能夠感受到:在使用水平比較高的IT開發(fā)人員中Google已經(jīng)成為最常用的搜索引擎。而使用百度的用戶也已經(jīng)大大超過了傳統(tǒng)的搜狐,新浪等門戶站點(diǎn),因此傳統(tǒng)門戶網(wǎng)站在搜索引擎上的優(yōu)勢(shì)將是非常脆弱的。而從技術(shù)的發(fā)展趨勢(shì)來看,以后還會(huì)有更多的利用互聯(lián)網(wǎng)媒體做更深層次數(shù)據(jù)挖掘的服務(wù)模式出現(xiàn):

           

          轉(zhuǎn)載自cnblog.org——“突發(fā)”文字可能揭示社會(huì)趨勢(shì)

          在“新科學(xué)家”(New Scientist)在線雜志上,公布了康奈爾大學(xué)的一個(gè)新研究成果,引人注目,也許與Google 收購Pyra 的動(dòng)機(jī)有關(guān)。

          這所大學(xué)的計(jì)算機(jī)科學(xué)家 Jon Klenberg 開發(fā)了一個(gè)計(jì)算機(jī)算法,能夠識(shí)別一篇文章中某些文字的“突發(fā)”增長,而且他發(fā)現(xiàn),這些“突發(fā)”增長的文字可以用來快速識(shí)別最新的趨勢(shì)和熱點(diǎn)問題,因此能夠更有效地篩選重要信息。過去很多搜索技術(shù)都采用了簡單計(jì)算文字/詞組出現(xiàn)頻率的方法,卻忽略了文字使用增加的速率。

          Jon 特別指出,這種方法可以應(yīng)用到大量Weblog上,以跟蹤社會(huì)趨勢(shì),這對(duì)商業(yè)應(yīng)用也很有潛力。例如,廣告商可以從成千上萬的個(gè)人Blog 中快速找到潛在的需求風(fēng)尚。而且只要Blog 覆蓋話題范圍足夠大(實(shí)際上發(fā)展趨勢(shì)確實(shí)如此),這項(xiàng)技術(shù)對(duì)政治、社會(huì)、文化和經(jīng)濟(jì)等領(lǐng)域也都會(huì)有實(shí)際意義了。

          雖然Google 新聞的內(nèi)部算法至今沒有公開,但是人們猜測(cè)這種完全由機(jī)器所搜集的頭條新聞應(yīng)當(dāng)不是Google搜索引擎中慣用的鴿子算法,很可能與這種“突發(fā)”判斷算法有關(guān)。如此說來,Google收購Blog工具供應(yīng)商的舉動(dòng)確實(shí)還有更深層次的遠(yuǎn)見了

          - NewScientist.com news,
          - 還沒有寫完這些介紹,在 SlashDot 上也看到了很多有關(guān)這個(gè)發(fā)現(xiàn)的討論

          附:Google官方的站點(diǎn)設(shè)計(jì)指南

          • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.  讓網(wǎng)站有著清晰的結(jié)構(gòu)和文本鏈接,所有的頁面至少要有一個(gè)靜態(tài)文本鏈接入口
            批注:盡量不要用圖片和JAVASCRIPT
          • Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.
            為用戶提供一個(gè)站點(diǎn)地圖:轉(zhuǎn)向網(wǎng)站的重要部分。如果站點(diǎn)地圖頁面超過100個(gè)鏈接,則需要將頁面分成多個(gè)頁面。
            批注:索引頁不要超過100個(gè)鏈接:SPIDER只考慮頁面中頭100個(gè)鏈接
          • Create a useful, information-rich site and write pages that clearly and accurately describe your content.
            用一些有用的,信息量豐富的站點(diǎn),清晰并正確的描述你的信息。
          • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
            想像用戶可能用來找到你的關(guān)鍵詞,并保證這些關(guān)鍵詞在網(wǎng)站中出現(xiàn)。
            批注:少用“最大”,“最好”之類的形容詞,用用戶最關(guān)心的詞,比如:下載,歌星名字,而不是一些抽象名詞。
          • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images.
            盡可能使用文本,而不是圖片顯示重要的名稱,內(nèi)容和鏈接。GOOGLE的機(jī)器人不認(rèn)識(shí)圖片中的文字。
          • Make sure that your TITLE and ALT tags are descriptive and accurate.
            保證:頁面的TITLE和ALT標(biāo)記正確的精確描述
          • Check for broken links and correct HTML.
            檢查壞鏈并修正這些HTML錯(cuò)誤。
          • If you decide to use dynamic pages (i.e., the URL contains a '?' character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them small.
            如果你打算使用動(dòng)態(tài)頁面:鏈接中包含"?",必須了解:并非所有的搜索引擎的機(jī)器人能想對(duì)待靜態(tài)頁面一樣對(duì)待動(dòng)態(tài)頁面,保持動(dòng)態(tài)頁面的參數(shù)盡可能的少也會(huì)很有幫助。
          • Keep the links on a given page to a reasonable number (fewer than 100).
            讓一個(gè)頁面中的鏈接少于100個(gè)。
            批注:用lynx -dump http://www.chedong.com 可以模擬從robot角度看到的頁面。其最后有鏈接統(tǒng)計(jì)

          輸出類似:

             [1]Google Free Search _______________________________ Google Search
             (_) Search WWW (_) Search chedong.com

             更 新 [2]站點(diǎn)地圖 / Site Map [3]留 言簿 / Guest Book [4]意見反饋 /
             Feed Back
              ...
          References

             Visible links
             1. http://www.google.com/services/free.html
             2. http://www.chedong.com/sitemap.html#sitemap
             3. http://www.chedong.com/guestbook/
             4. http://www.chedong.com/formmail.htm
              ...
             Hidden links:
            50. http://www.chedong.com/bbcweb/
              ...

          搜索引擎的宗旨在于提取互聯(lián)網(wǎng)中質(zhì)量最好的內(nèi)容提供給用戶,任何有利于幫助用戶獲得相對(duì)公正,優(yōu)質(zhì)內(nèi)容的策略都是搜索引擎追求目標(biāo)。PageRank是一個(gè)非常好的策略,但是并非所有策略都是基于非常復(fù)雜的算法。
          從搜索引擎看來什么是互聯(lián)網(wǎng)中“好”的內(nèi)容呢?

          • 首先:互聯(lián)網(wǎng)大約是8G個(gè)網(wǎng)頁,而且以每天2M的速度增長的。其中80%以上是動(dòng)態(tài)網(wǎng)頁,而占總量20%的靜態(tài)網(wǎng)頁就是一個(gè)相對(duì)比較簡單的過濾規(guī)則。
          • 其次:用戶友好(User friendly)也是很重要的方面,搜索引擎利用算法幫助提升這些優(yōu)質(zhì)網(wǎng)站,包括:通過CSS將內(nèi)容和表現(xiàn)分離:較少的javascript和frame結(jié)構(gòu),spider本身也很難深入抓取這些網(wǎng)頁:Javascript和frame結(jié)構(gòu)大部分是廣告。
          • 標(biāo)題明確:無標(biāo)題,重復(fù)標(biāo)題或者標(biāo)題SPAM(類似于:游戲游戲游戲游戲游戲游戲這樣的標(biāo)題)進(jìn)行過濾或降低得分頁面大小:因?yàn)轫撁孢^大會(huì)導(dǎo)致用戶下載緩慢,所以很多引擎只計(jì)算頁面大小在100k以內(nèi)的網(wǎng)頁。
          • 鏈接引用:不僅需要有鏈接鏈入,也需要幫助用戶找到其他更有價(jià)值的內(nèi)容;
          • 文件類型:PDF和DOC等專業(yè)文檔和來自edu,gov等非贏利網(wǎng)站的內(nèi)容;
          • 鏈入網(wǎng)站的文字:所有用戶不可見的因素全部被忽略。此外:用戶搜索的行為本身也被Google記錄,可能對(duì)目標(biāo)網(wǎng)站的主題相關(guān)度有幫助。

           

          參考資料:

          面向Google搜索引擎的網(wǎng)站設(shè)計(jì)優(yōu)化
          http://www.google-search-engine-optimization.com/



          如何評(píng)價(jià)一個(gè)網(wǎng)站的人氣
          http://www.chedong.com/tech/link_pop_check.html

          如何提高網(wǎng)站在Google中的排名——面向搜索引擎的廣告模式
          http://www.chedong.com/tech/google_ads.html

          如何提高網(wǎng)站在Google中的排名——面向搜索引擎的網(wǎng)站鏈接設(shè)計(jì)
          http://www.chedong.com/tech/google_url.html

          Google不斷改進(jìn)相應(yīng)的算法:HillTop
          Hilltop: A Search Engine based on Expert Documents

          Google の秘密 - PageRank 徹底解説
          http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
          這篇文章是在查"Google PageRank"的時(shí)候查到的,這篇文章不僅有一個(gè)算法說明,也是一個(gè)Google的weblog,記錄了很多關(guān)于Google的新聞和一些市場(chǎng)動(dòng)態(tài)信息。
          Google 的秘密- PageRank 徹底解說 中文版

          更詳細(xì)的PageRank算法說明:
          http://pr.efactory.de/

          WEB日志統(tǒng)計(jì)工具AWStats的使用:增加了Unicode的解碼和中國主要門戶搜索的定義
          http://www.chedong.com/tech/awstats.html

          Robots的說明:
          http://bar.baidu.com/robots/
          http://www.google.com/bot.html
          搜索引擎通過一種程序robot(又稱spider),自動(dòng)訪問互聯(lián)網(wǎng)上的網(wǎng)頁并獲取網(wǎng)頁信息。您可以在您的網(wǎng)站中創(chuàng)建一個(gè)純文本文件 robots.txt,在這個(gè)文件中聲明該網(wǎng)站中哪些內(nèi)容可以被robot訪問,哪些不可以。

          反Google站點(diǎn):觀點(diǎn)也很有趣
          http://www.google-watch.org/

          關(guān)于Google的WebLog
          http://google.blogspace.com/

          關(guān)于Google的HillTop算法

          搜索引擎相關(guān)論壇
          http://searchengineforums.com/
          http://searchenginewatch.com
          http://www.webmasterworld.com/

          posted @ 2008-01-04 09:43 風(fēng)雨兼程 閱讀(266) | 評(píng)論 (0)編輯 收藏

          開發(fā)電子商務(wù)網(wǎng)站對(duì)數(shù)據(jù)庫表的設(shè)計(jì)

          系統(tǒng)分析

            功能需求分析

            (1):產(chǎn)品展示,按照分類展示全部產(chǎn)品,和對(duì)應(yīng)的相關(guān)信息。

            (2):增加產(chǎn)品的展示相關(guān)度,諸如最新產(chǎn)品報(bào)道,網(wǎng)站的新聞,促銷信息。

            (3):購物車,跟蹤用戶的購物情況

            (4):結(jié)算中心:處理用戶帳單,購物處理

            (5):反饋互動(dòng)區(qū),可以留言

            (6):會(huì)員信息模塊,可以注冊(cè)

            數(shù)據(jù)需求分析

            數(shù)據(jù)庫表設(shè)計(jì)定為8個(gè)表實(shí)現(xiàn):

            ccdot_user{用戶信息表}:

            ------szd_userid[PK]

            ------szd_username[用戶ID]

            ------szd_password[用戶密碼]

            ------szd_name[用戶真是信息]

            ------szd_question[丟失密碼問題]

            ------szd_answer[用戶回答答案,用于找密碼]

            ------szd_sex[性別]

            ------szd_phone[電話]

            ------szd_email[電子郵件]

            ------szd_address[地址]

            ------szd_post[郵編]

            ------szd_province[省份]

            ------szd_city[城市]

            ------szd_mark[標(biāo)記]

            ccdot_aclass{產(chǎn)品大類}

            ------szd_aclassid[PK]

            ------szd_aclassname[名稱]

            ccdot_bclass{產(chǎn)品小類}

            ------szd_bclassid[pk]

            ------szd_aclassid[關(guān)聯(lián)大類szd_aclassid]

            ------szd_bclassname[名稱]

            ccdot_poduct{產(chǎn)品信息}

            ------szd_productid[pk]

            ------szd_bclassid[關(guān)聯(lián)小類的szd_bclassid]

            ------szd_pname[名稱]

            ------szd_pdetail[產(chǎn)品信息]

            ------szd_pprice[一般價(jià)格]

            ------szd_pmemderprice[會(huì)員價(jià)]

            ------szd_pfewprice[差價(jià)]

            ------szd_ppicture[圖片]

            ------szd_ptime[添加時(shí)間]

            ------szd_stock[產(chǎn)品庫存]

            ------szd_phit[產(chǎn)品點(diǎn)擊次數(shù)]

            ------szd_pdetail1[其他產(chǎn)品描述]

            ccdot_news{新聞}

            ------szd_newsid[PK]

            ------szd_title[標(biāo)題]

            ------szd_content[內(nèi)容]

            ------szd_time[添加時(shí)間]

            ------szd_type[類型]

            ccdot_guest{評(píng)論}

            ------szd_gid[PK]

            ------szd_gname[昵稱]

            ------szd_gcontent[留言內(nèi)容]

            ------szd_productid[關(guān)聯(lián)產(chǎn)品的主鍵]

            ------szd_gtime[留言時(shí)間]

            ------szd_gip[留言者ip]

            ccdot_orderlist{訂單列表}

            ------szd_orderlistid[PK]

            ------szd_orderid[關(guān)聯(lián)詳細(xì)訂單的主鍵]

            ------szd_productid[關(guān)聯(lián)產(chǎn)品的主鍵]

            ------szd_quantity[所定數(shù)目]

            ------szd_unitcost[單價(jià)]

            ------szd_productname[產(chǎn)品名稱]

            ccdot_orders{訂單信息表}

            ------szd_orderid[PK]

            ------szd_userid[關(guān)聯(lián)用戶主鍵]

            ------szd_orderdate[訂單日期]

            ------szd_linkman[聯(lián)系人]

            ------szd_email[聯(lián)系人email]

            ------szd_phone[聯(lián)系電話]

            ------szd_postalcode[送貨處郵編]

            ------szd_address[送貨地址]

            ------szd_result[處理結(jié)果]

            ------szd_remark[備注]

            ------szd_songhuoqixian[送貨期限]

            ------szd_songhuofangshi[發(fā)貨方式]

            ------szd_fukuanfangshi[付款方式]

            ------szd_error[意外說明]

          posted @ 2008-01-02 15:20 風(fēng)雨兼程 閱讀(353) | 評(píng)論 (0)編輯 收藏

          petshop4.0設(shè)計(jì)說明asp.net初學(xué)者

          petshop4.0設(shè)計(jì)說明
          一、項(xiàng)目名稱及描述:(實(shí)現(xiàn)步驟為:4-3-6-5-2-1)
          1、WEB=表示層
          2、BLL=業(yè)務(wù)邏輯層
          3、IDAL=數(shù)據(jù)訪問層接口定義
          4、Model=業(yè)務(wù)實(shí)體
          5、DALFactory=數(shù)據(jù)層的抽象工廠(創(chuàng)建反射)
          6、SQLServerDAL=SQLServer數(shù)據(jù)訪問層 / OracleDAL=Oracle數(shù)據(jù)訪問層

          DBUtility 數(shù)據(jù)庫訪問組件基礎(chǔ)類

          二、項(xiàng)目引用關(guān)系
          1、Web 引用 BLL。
          2、BLL 引用 IDAL,Model,使用DALFactory創(chuàng)建實(shí)例。
          3、IDAL 引用 Model。
          4、Model 無引用。
          5、DALFactory 引用IDAL,通過讀取web.config里設(shè)置的程序集,加載類的實(shí)例,返回給BLL使用。
          6、SQLServerDAL 引用 Model和IDAL,被DALFactory加載的程序集,實(shí)現(xiàn)接口里的方法。


          三、實(shí)現(xiàn)步驟
          1、創(chuàng)建Model,實(shí)現(xiàn)業(yè)務(wù)實(shí)體。
          2、創(chuàng)建IDAL,實(shí)現(xiàn)接口。
          3、創(chuàng)建SQLServerDAL,實(shí)現(xiàn)接口里的方法。
          4、增加web.config里的配置信息,為SQLServerDAL的程序集。
          5、創(chuàng)建DALFactory,返回程序集的指定類的實(shí)例。
          6、創(chuàng)建BLL,調(diào)用DALFactory,得到程序集指定類的實(shí)例,完成數(shù)據(jù)操作方法。
          7、創(chuàng)建WEB,調(diào)用BLL里的數(shù)據(jù)操作方法。

          注意:
          1、web.config里的程序集名稱必須與SQLServerDAL里的輸出程序集名稱一致。
          2、DALFactory里只需要一個(gè)DataAccess類,可以完成創(chuàng)建所有的程序集實(shí)例。
          3、項(xiàng)目創(chuàng)建后,注意修改各項(xiàng)目的默認(rèn)命名空間和程序集名稱。
          4、注意修改解決方案里的項(xiàng)目依賴。
          5、注意在解決方案里增加各項(xiàng)目引用。

          posted @ 2007-12-26 17:05 風(fēng)雨兼程 閱讀(1566) | 評(píng)論 (0)編輯 收藏

          Getting Real 讀書筆記

          無論是創(chuàng)業(yè)還是做項(xiàng)目,無論是單機(jī)軟件還是 Web app,都需要遵循的就是滿足需求

          需求和開發(fā)的矛盾,至少在我看來,是產(chǎn)品開發(fā)中的主要矛盾。提需求的覺得產(chǎn)品沒有滿足需求,開發(fā)的覺得需求不明確或者胡來。最后的結(jié)果,要么是產(chǎn)品延期,要么是個(gè)破爛

          是否有一些方法或者經(jīng)驗(yàn),可以指導(dǎo)我們更成功地開發(fā) Web app 呢?或者不僅僅是開發(fā),還包括設(shè)計(jì),推廣,人事……作為創(chuàng)業(yè)或者實(shí)踐的一整套指導(dǎo)

          這就是我想推薦給大家的《Getting Real》。

          Getting Real 是著名的 37signals 公司(Ruby on Rails 的締造者)去年撰寫的一本書,主要內(nèi)容是指導(dǎo)小型公司/團(tuán)體成功地商業(yè)運(yùn)作起 Web 產(chǎn)品,提供了包括相關(guān)理念,思路,人員,技術(shù),方法論,實(shí)例等等許多信息,非常適合 Web 開發(fā)人員,產(chǎn)品人員和創(chuàng)業(yè)者參考。

          書專注于以下幾點(diǎn):
          1. 成功的商業(yè)產(chǎn)品,以客戶利益和感受至上。
          2. 小型的團(tuán)隊(duì),高靈活性和適應(yīng)性。
          3. 精簡的產(chǎn)品,夠用好用的功能。
          4. 高效的設(shè)計(jì)和開發(fā)過程,杜絕浪費(fèi)時(shí)間,減少需求和開發(fā)的矛盾。
          5. 巧妙的推廣和售后支持。
          ……

          posted @ 2007-12-26 15:12 風(fēng)雨兼程 閱讀(263) | 評(píng)論 (0)編輯 收藏

          層隨著鼠標(biāo)移動(dòng)

          var c = document.getElementById("divTool");
           c.style.position = "absolute";
           var eT = obj.offsetTop; 
              var eH = obj.offsetHeight+eT; 
           c.style.left = window.event.clientX-event.offsetX+document.documentElement.scrollLeft-20;
              c.style.top = window.event.clientY-event.offsetY+document.documentElement.scrollTop+eH-8;


           c.style.display = "block";

          posted @ 2007-12-26 14:44 風(fēng)雨兼程 閱讀(567) | 評(píng)論 (0)編輯 收藏

          解決downlist 等優(yōu)先極高于其它控件,浮在其它控件上面

           <iframe style="position:absolute;z-index:9;width:expression(this.nextSibling.offsetWidth);height:expression(this.nextSibling.offsetHeight);top:expression(this.nextSibling.offsetTop);left:expression(this.nextSibling.offsetLeft);" frameborder="0" ></iframe>
            <div id="divTool" onmouseover="javascript:showdiv123()" onmouseout="javascript:HiddivTool()" class="class_title"  style="display:none">
          <table width="100" border="0"  align="center" cellpadding="0" cellspacing="0">
            <tr>
              <td height="20" colspan="2" bgcolor="ffffff" style="width: 100px" >&nbsp;&nbsp;<span class="t1" style="cursor:hand" name="layout/AddPage.aspx" onclick="javascript:openMyPage(this)">More tools</span></td>
            </tr>
            <tr>
              <td height="20" colspan="2"  bgcolor="ffffff"  style="width: 100px">&nbsp;&nbsp;<a href="#">About this tools</a></td>
            </tr><tr>
              <td height="8" colspan="2" bgcolor="ffffff" style="width: 100px"></td>
            </tr>
           
            </table>
          </div>

          posted @ 2007-12-26 14:35 風(fēng)雨兼程 閱讀(329) | 評(píng)論 (0)編輯 收藏

          在PetShop 4.0中ASP.NET緩存的實(shí)現(xiàn)

          PetShop作為一個(gè)B2C的寵物網(wǎng)上商店,需要充分考慮訪客的用戶體驗(yàn),如果因?yàn)閿?shù)據(jù)量大而導(dǎo)致Web服務(wù)器的響應(yīng)不及時(shí),頁面和查詢數(shù)據(jù)遲遲得不到結(jié)果,會(huì)因此而破壞客戶訪問網(wǎng)站的心情,在耗盡耐心的等待后,可能會(huì)失去這一部分客戶。無疑,這是非常糟糕的結(jié)果。因而在對(duì)其進(jìn)行體系架構(gòu)設(shè)計(jì)時(shí),整個(gè)系統(tǒng)的性能就顯得殊為重要。然而,我們不能因噎廢食,因?yàn)閷W⒂谛阅芏雎詳?shù)據(jù)的正確性。在PetShop 3.0版本以及之前的版本,因?yàn)锳SP.NET緩存的局限性,這一問題并沒有得到很好的解決。PetShop 4.0則引入了SqlCacheDependency特性,使得系統(tǒng)對(duì)緩存的處理較之以前大為改觀。

          4.3.1  CacheDependency接口

          PetShop 4.0引入了SqlCacheDependency特性,對(duì)Category、Product和Item數(shù)據(jù)表對(duì)應(yīng)的緩存實(shí)施了SQL Cache Invalidation技術(shù)。當(dāng)對(duì)應(yīng)的數(shù)據(jù)表數(shù)據(jù)發(fā)生更改后,該技術(shù)能夠?qū)⑾嚓P(guān)項(xiàng)從緩存中移除。實(shí)現(xiàn)這一技術(shù)的核心是SqlCacheDependency類,它繼承了CacheDependency類。然而為了保證整個(gè)架構(gòu)的可擴(kuò)展性,我們也允許設(shè)計(jì)者建立自定義的CacheDependency類,用以擴(kuò)展緩存依賴。這就有必要為CacheDependency建立抽象接口,并在web.config文件中進(jìn)行配置。

          在PetShop 4.0的命名空間PetShop.ICacheDependency中,定義了名為IPetShopCacheDependency接口,它僅包含了一個(gè)接口方法:
          public interface IPetShopCacheDependency
          {      
              AggregateCacheDependency GetDependency();
          }

          AggregateCacheDependency是.Net Framework 2.0新增的一個(gè)類,它負(fù)責(zé)監(jiān)視依賴項(xiàng)對(duì)象的集合。當(dāng)這個(gè)集合中的任意一個(gè)依賴項(xiàng)對(duì)象發(fā)生改變時(shí),該依賴項(xiàng)對(duì)象對(duì)應(yīng)的緩存對(duì)象都將被自動(dòng)移除。
          AggregateCacheDependency類起到了組合CacheDependency對(duì)象的作用,它可以將多個(gè)CacheDependency對(duì)象甚至于不同類型的CacheDependency對(duì)象與緩存項(xiàng)建立關(guān)聯(lián)。由于PetShop需要為Category、Product和Item數(shù)據(jù)表建立依賴項(xiàng),因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回建立了這些依賴項(xiàng)的AggregateCacheDependency對(duì)象。

          4.3.2  CacheDependency實(shí)現(xiàn)

          CacheDependency的實(shí)現(xiàn)正是為Category、Product和Item數(shù)據(jù)表建立了對(duì)應(yīng)的SqlCacheDependency類型的依賴項(xiàng),如代碼所示:
          public abstract class TableDependency : IPetShopCacheDependency
          {
              // This is the separator that's used in web.config
              protected char[] configurationSeparator = new char[] { ',' };

              protected AggregateCacheDependency dependency = new AggregateCacheDependency();
              protected TableDependency(string configKey)
              {
                  string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
                  string tableConfig = ConfigurationManager.AppSettings[configKey];
                  string[] tables = tableConfig.Split(configurationSeparator);

                  foreach (string tableName in tables)
                      dependency.Add(new SqlCacheDependency(dbName, tableName));
              }
              public AggregateCacheDependency GetDependency()
             {
                  return dependency;
              }
          }

          需要建立依賴項(xiàng)的數(shù)據(jù)庫與數(shù)據(jù)表都配置在web.config文件中,其設(shè)置如下:
          <add key="CacheDatabaseName" value="MSPetShop4"/>
          <add key="CategoryTableDependency" value="Category"/>
          <add key="ProductTableDependency" value="Product,Category"/>
          <add key="ItemTableDependency" value="Product,Category,Item"/>

          根據(jù)各個(gè)數(shù)據(jù)表間的依賴關(guān)系,因而不同的數(shù)據(jù)表需要建立的依賴項(xiàng)也是不相同的,從配置文件中的value值可以看出。然而不管建立依賴項(xiàng)的多寡,其創(chuàng)建的行為邏輯都是相似的,因而在設(shè)計(jì)時(shí),抽象了一個(gè)共同的類TableDependency,并通過建立帶參數(shù)的構(gòu)造函數(shù),完成對(duì)依賴項(xiàng)的建立。由于接口方法GetDependency()的實(shí)現(xiàn)中,返回的對(duì)象dependency是在受保護(hù)的構(gòu)造函數(shù)創(chuàng)建的,因此這里的實(shí)現(xiàn)方式也可以看作是Template Method模式的靈活運(yùn)用。例如TableDependency的子類Product,就是利用父類的構(gòu)造函數(shù)建立了Product、Category數(shù)據(jù)表的SqlCacheDependency依賴:
          public class Product : TableDependency
          {
              public Product() : base("ProductTableDependency") { }
          }

          如果需要自定義CacheDependency,那么創(chuàng)建依賴項(xiàng)的方式又有不同。然而不管是創(chuàng)建SqlCacheDependency對(duì)象,還是自定義的CacheDependency對(duì)象,都是將這些依賴項(xiàng)添加到AggregateCacheDependency類中,因而我們也可以為自定義CacheDependency建立專門的類,只要實(shí)現(xiàn)IPetShopCacheDependency接口即可。

          4.3.3  CacheDependency工廠

          繼承了抽象類TableDependency的Product、Category和Item類均需要在調(diào)用時(shí)創(chuàng)建各自的對(duì)象。由于它們的父類TableDependency實(shí)現(xiàn)了接口IPetShopCacheDependency,因而它們也間接實(shí)現(xiàn)了IPetShopCacheDependency接口,這為實(shí)現(xiàn)工廠模式提供了前提。

          在PetShop 4.0中,依然利用了配置文件和反射技術(shù)來實(shí)現(xiàn)工廠模式。命名空間PetShop.CacheDependencyFactory中,類DependencyAccess即為創(chuàng)建IPetShopCacheDependency對(duì)象的工廠類:
          public static class DependencyAccess
          {       
              public static IPetShopCacheDependency CreateCategoryDependency()
              {
                  return LoadInstance("Category");
              }
              public static IPetShopCacheDependency CreateProductDependency()
              {
                  return LoadInstance("Product");
              }
              public static IPetShopCacheDependency CreateItemDependency()
              {
                  return LoadInstance("Item");
              }
              private static IPetShopCacheDependency LoadInstance(string className)
              {
                  string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
                  string fullyQualifiedClass = path + "." + className;
                  return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
              }
          }
          整個(gè)工廠模式的實(shí)現(xiàn)如圖4-3所示:

          4-3.gif
           圖4-3 CacheDependency工廠

          雖然DependencyAccess類創(chuàng)建了實(shí)現(xiàn)了IPetShopCacheDependency接口的類Category、Product、Item,然而我們之所以引入IPetShopCacheDependency接口,其目的就在于獲得創(chuàng)建了依賴項(xiàng)的AggregateCacheDependency類型的對(duì)象。我們可以調(diào)用對(duì)象的接口方法GetDependency(),如下所示:
          AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();

          為了方便調(diào)用者,似乎我們可以對(duì)DependencyAccess類進(jìn)行改進(jìn),將原有的CreateCategoryDependency()方法,修改為創(chuàng)建AggregateCacheDependency類型對(duì)象的方法。

          然而這樣的做法擾亂了作為工廠類的DependencyAccess的本身職責(zé),且創(chuàng)建IPetShopCacheDependency接口對(duì)象的行為仍然有可能被調(diào)用者調(diào)用,所以保留原有的DependencyAccess類仍然是有必要的。

          在PetShop 4.0的設(shè)計(jì)中,是通過引入Facade模式以方便調(diào)用者更加簡單地獲得AggregateCacheDependency類型對(duì)象。

          4.3.4  引入Facade模式

          利用Facade模式可以將一些復(fù)雜的邏輯進(jìn)行包裝,以方便調(diào)用者對(duì)這些復(fù)雜邏輯的調(diào)用。就好像提供一個(gè)統(tǒng)一的門面一般,將內(nèi)部的子系統(tǒng)封裝起來,統(tǒng)一為一個(gè)高層次的接口。一個(gè)典型的Facade模式示意圖如下所示:

          4-4.gif
          圖4-4 Facade模式

          Facade模式的目的并非要引入一個(gè)新的功能,而是在現(xiàn)有功能的基礎(chǔ)上提供一個(gè)更高層次的抽象,使得調(diào)用者可以直接調(diào)用,而不用關(guān)心內(nèi)部的實(shí)現(xiàn)方式。以CacheDependency工廠為例,我們需要為調(diào)用者提供獲得AggregateCacheDependency對(duì)象的簡便方法,因而創(chuàng)建了DependencyFacade類:
          public static class DependencyFacade
          {
              private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
              public static AggregateCacheDependency GetCategoryDependency()
              {
                  if (!string.IsNullOrEmpty(path))
                      return DependencyAccess.CreateCategoryDependency().GetDependency();
                  else
                      return null;
              }
              public static AggregateCacheDependency GetProductDependency()
              {
                  if (!string.IsNullOrEmpty(path))
                      return DependencyAccess.CreateProductDependency().GetDependency();
                  else
                      return null;
                  }
              public static AggregateCacheDependency GetItemDependency()
              {
                  if (!string.IsNullOrEmpty(path))
                      return DependencyAccess.CreateItemDependency().GetDependency();
                  else
                      return null;
              }
          }

          DependencyFacade類封裝了獲取AggregateCacheDependency類型對(duì)象的邏輯,如此一來,調(diào)用者可以調(diào)用相關(guān)方法獲得創(chuàng)建相關(guān)依賴項(xiàng)的AggregateCacheDependency類型對(duì)象:
          AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();

          比起直接調(diào)用DependencyAccess類的GetDependency()方法而言,除了方法更簡單之外,同時(shí)它還對(duì)CacheDependencyAssembly配置節(jié)進(jìn)行了判斷,如果其值為空,則返回null對(duì)象。

          在PetShop.Web的App_Code文件夾下,靜態(tài)類WebUtility的GetCategoryName()和GetProductName()方法調(diào)用了DependencyFacade類。例如GetCategoryName()方法:
          public static string GetCategoryName(string categoryId)
          {
               Category category = new Category();
               if (!enableCaching)
                      return category.GetCategory(categoryId).Name;

               string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId);

               // 檢查緩存中是否存在該數(shù)據(jù)項(xiàng);
               string data = (string)HttpRuntime.Cache[cacheKey];
               if (data == null)
               {
                     // 通過web.config的配置獲取duration值;
                     int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
                     // 如果緩存中不存在該數(shù)據(jù)項(xiàng),則通過業(yè)務(wù)邏輯層訪問數(shù)據(jù)庫獲取;
                     data = category.GetCategory(categoryId).Name;
                     // 通過Facade類創(chuàng)建AggregateCacheDependency對(duì)象;
                     AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
                     // 將數(shù)據(jù)項(xiàng)以及AggregateCacheDependency 對(duì)象存儲(chǔ)到緩存中;
                     HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                }
                return data;
          }

          GetCategoryName()方法首先會(huì)檢查緩存中是否已經(jīng)存在CategoryName數(shù)據(jù)項(xiàng),如果已經(jīng)存在,就通過緩存直接獲取數(shù)據(jù);否則將通過業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問層訪問數(shù)據(jù)庫獲得CategoryName,在獲得了CategoryName后,會(huì)將新獲取的數(shù)據(jù)連同DependencyFacade類創(chuàng)建的AggregateCacheDependency對(duì)象添加到緩存中。

          WebUtility靜態(tài)類被表示層的許多頁面所調(diào)用,例如Product頁面:
          public partial class Products : System.Web.UI.Page
          {
              protected void Page_Load(object sender, EventArgs e)
              {
                  Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
              }
          }

          顯示頁面title的邏輯是放在Page_Load事件方法中,因而每次打開該頁面都要執(zhí)行獲取CategoryName的方法。如果沒有采用緩存機(jī)制,當(dāng)Category數(shù)據(jù)較多時(shí),頁面的顯示就會(huì)非常緩慢。

          4.3.5  引入Proxy模式

          業(yè)務(wù)邏輯層BLL中與Product、Category、Item有關(guān)的業(yè)務(wù)方法,其實(shí)現(xiàn)邏輯是調(diào)用數(shù)據(jù)訪問層(DAL)對(duì)象訪問數(shù)據(jù)庫,以獲取相關(guān)數(shù)據(jù)。為了改善系統(tǒng)性能,我們就需要為這些實(shí)現(xiàn)方法增加緩存機(jī)制的邏輯。當(dāng)我們操作增加了緩存機(jī)制的業(yè)務(wù)對(duì)象時(shí),對(duì)于調(diào)用者而言,應(yīng)與BLL業(yè)務(wù)對(duì)象的調(diào)用保持一致。也即是說,我們需要引入一個(gè)新的對(duì)象去控制原來的BLL業(yè)務(wù)對(duì)象,這個(gè)新的對(duì)象就是Proxy模式中的代理對(duì)象。

          以PetShop.BLL.Product業(yè)務(wù)對(duì)象為例,PetShop為其建立了代理對(duì)象ProductDataProxy,并在GetProductByCategory()等方法中,引入了緩存機(jī)制,例如:
          public static class ProductDataProxy
          {

              private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings["ProductCacheDuration"]);
              private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
                 
              public static IList
          GetProductsByCategory(string category)
              {
                  Product product = new Product();

                  if (!enableCaching)
                      return product.GetProductsByCategory(category);

                  string key = "product_by_category_" + category;
                  IList data = (IList )HttpRuntime.Cache[key];

                  // Check if the data exists in the data cache
                  if (data == null)
                  {
                      data = product.GetProductsByCategory(category);

                      // Create a AggregateCacheDependency object from the factory
                      AggregateCacheDependency cd = DependencyFacade.GetProductDependency();

                      // Store the output in the data cache, and Add the necessary AggregateCacheDependency object
                      HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                  }
                  return data;
              }
          }

          與業(yè)務(wù)邏輯層Product對(duì)象的GetProductsByCategory()方法相比,增加了緩存機(jī)制。當(dāng)緩存內(nèi)不存在相關(guān)數(shù)據(jù)項(xiàng)時(shí),則直接調(diào)用業(yè)務(wù)邏輯層Product的GetProductsByCategory()方法來獲取數(shù)據(jù),并將其與對(duì)應(yīng)的AggregateCacheDependency對(duì)象一起存儲(chǔ)在緩存中。

          引入Proxy模式,實(shí)現(xiàn)了在緩存級(jí)別上對(duì)業(yè)務(wù)對(duì)象的封裝,增強(qiáng)了對(duì)業(yè)務(wù)對(duì)象的控制。由于暴露在對(duì)象外的方法是一致的,因而對(duì)于調(diào)用方而言,調(diào)用代理對(duì)象與真實(shí)對(duì)象并沒有實(shí)質(zhì)的區(qū)別。

          從職責(zé)分離與分層設(shè)計(jì)的角度分析,我更希望這些Proxy對(duì)象是被定義在業(yè)務(wù)邏輯層中,而不像在PetShop的設(shè)計(jì)那樣,被劃分到表示層UI中。此外,如果需要考慮程序的可擴(kuò)展性與可替換性,我們還可以為真實(shí)對(duì)象與代理對(duì)象建立統(tǒng)一的接口或抽象類。然而,單以PetShop的表示層調(diào)用來看,采用靜態(tài)類與靜態(tài)方法的方式,或許更為合理。我們需要謹(jǐn)記,“過度設(shè)計(jì)”是軟件設(shè)計(jì)的警戒線。

          如果需要對(duì)UI層采用緩存機(jī)制,將應(yīng)用程序數(shù)據(jù)存放到緩存中,就可以調(diào)用這些代理對(duì)象。以ProductsControl用戶控件為例,調(diào)用方式如下:
          productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);

          productsList對(duì)象屬于自定義的CustomList類型,這是一個(gè)派生自System.Web.UI.WebControls.DataList控件的類,它的DataSource屬性可以接受IList集合對(duì)象。
          不過在PetShop 4.0的設(shè)計(jì)中,對(duì)于類似于ProductsControl類型的控件而言,采用的緩存機(jī)制是頁輸出緩存。我們可以從ProductsControl.ascx頁面的Source代碼中發(fā)現(xiàn)端倪:
          <%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>

          與ASP.NET 1.x的頁輸出緩存不同的是,在ASP.NET 2.0中,為ASP.NET用戶控件新引入了CachePolicy屬性,該屬性的類型為ControlCachePolicy類,它以編程方式實(shí)現(xiàn)了對(duì)ASP.NET用戶控件的輸出緩存設(shè)置。我們可以通過設(shè)置ControlCachePolicy類的Dependency屬性,來設(shè)置與該用戶控件相關(guān)的依賴項(xiàng),例如在ProductsControl用戶控件中,進(jìn)行如下的設(shè)置:
          protected void Page_Load(object sender, EventArgs e)
          {
              this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
          }

          采用頁輸出緩存,并且利用ControlCachePolicy設(shè)置輸出緩存,能夠?qū)I(yè)務(wù)數(shù)據(jù)與整個(gè)頁面放入到緩存中。這種方式比起應(yīng)用程序緩存而言,在性能上有很大的提高。同時(shí),它又通過引入的SqlCacheDependency特性有效地避免了“數(shù)據(jù)過期”的缺點(diǎn),因而在PetShop 4.0中被廣泛采用。相反,之前為Product、Category、Item業(yè)務(wù)對(duì)象建立的代理對(duì)象則被“投閑散置”,僅僅作為一種設(shè)計(jì)方法的展示而“幸存”與整個(gè)系統(tǒng)的源代碼中。

          posted @ 2007-12-26 12:07 風(fēng)雨兼程 閱讀(1281) | 評(píng)論 (1)編輯 收藏

          IList GetCategories();的問題

          petshop4.0中的一段代碼  
             
            public   interface   ICategory   {  
             
            ///   <summary>  
            ///   Method   to   get   all   categories  
            ///   </summary>  
                            ///   <returns>Interface   to   Model   Collection   Generic   of   categories</returns>  
                       
                           
            IList<CategoryInfo>   GetCategories();  
                           
             
                            ///   <summary>  
                            ///   Get   information   on   a   specific   category  
                            ///   </summary>  
                            ///   <param   name="categoryId">Unique   identifier   for   a   category</param>  
                            ///   <returns>Business   Entity   representing   an   category</returns>  
                            CategoryInfo   GetCategory(string   categoryId);  
            }  
             
             
            我知道IList<CategoryInfo>是范型  
            表示list中的item是CategoryInfo對(duì)象  
             
             
            請(qǐng)問為什么用IList<CategoryInfo>  
            用List<CategoryInfo>可以嗎?  
             
            兩者有什么區(qū)別?謝謝  

          沒有什么區(qū)別,這樣寫靈活性大,實(shí)現(xiàn)ilist接口的類很多,你寫成list后,也許以后你要改成非list的,就會(huì)要改很多代碼
          舉個(gè)例子  
             
            RenderControlToString(DataList   L//Control   C)  
             
            你認(rèn)為是寫control還是寫datalist代碼的通用性高?

            OOP編碼原則:盡可能用接口編程

          posted @ 2007-12-26 11:44 風(fēng)雨兼程 閱讀(472) | 評(píng)論 (0)編輯 收藏

          關(guān)于sqlhelper.cs

          public abstract class SqlHelper
                    {
                        public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
                  
                        SqlConnection conn;

                        #region open SqlConnection
                        public static void Open() {
                             conn = new SqlConnection(connectionString);
                             if (conn.State != ConnectionState.Open)
                                conn.Open();
                        }    
                        #endregion

                        #region close SqlConnection
                        public static void Close() {
                            if (conn != null)
                            {
                                conn.Close();
                                conn.Dispose();
                            }
                        }        
                        #endregion

                        #region prepare SqlCommand
                        private static void PrepareCommand(SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
                            Open();
                            cmd.Connection = conn;
                            cmd.CommandType = cmdType;
                            cmd.CommandText = cmdText;

                            if (cmdParms != null)
                            {
                                foreach (SqlParameter parm in cmdParms)
                                    cmd.Parameters.Add(parm);
                            }
                        }
                        #endregion

                        #region parm cache
                        /*
                         使用一個(gè)哈希表來保存緩存的參數(shù) 只緩存參數(shù)名
                         哈希表的特點(diǎn):一個(gè)鍵對(duì)應(yīng)一個(gè)值key對(duì)value(為object需要類型轉(zhuǎn)化)        不能出現(xiàn)兩個(gè)相同的鍵 否則error
                   
                         下面的哈希表parmCache定義為static即一次定義全局使用
                         所以可能會(huì)出現(xiàn)有人在讀的時(shí)候,有人在寫,一般會(huì)用Lock就像Asp中用Application["count"]來統(tǒng)計(jì)點(diǎn)擊數(shù)一樣
                         要先鎖后解鎖
                         但.net框架提供了Synchroized          sync和syncroize中文意思 同步,同時(shí)發(fā)生
                         來提供這一操作
                        */
                        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

                        public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
                            parmCache[cacheKey] = commandParameters;
                        }

                        /*
                        1、為何要克隆呢 為何不直接return cachedParms
                   
                        有一個(gè)參數(shù)數(shù)組
                        SqlParameter[] parms={
                        new SqlParameter("@num1",SqlDbType.Int,4),
                        new SqlParameter("@num2",SqlDbType.Int,4)
                        }
                        緩存該數(shù)組
                        用戶a和b都執(zhí)行插入操作
                        a用戶插入了1,1
                        b用戶插入了2,2
                        如果不用克隆的話,參數(shù)數(shù)組只有一份
                        而2個(gè)用戶需要根據(jù)不同的情況賦于不同的值
                        所以就用了克隆了
                  
                        2、(ICloneable)cachedParms[i]先將HashTable轉(zhuǎn)為ICloneable這樣HashTable就具有了Clone()克隆方法了
                        克隆一份后是什么類型呢,,當(dāng)然要強(qiáng)制轉(zhuǎn)化為(SqlParameter)了
                        最后將它賦值給clonedParms[i]
                        */       
                        public static SqlParameter[] GetCachedParameters(string cacheKey) {
                            SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];

                            if (cachedParms == null)
                                return null;
                            SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

                            for (int i = 0; i < cachedParms.Length; i++)
                                clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

                            return clonedParms;
                        }
                        #endregion        
                  
                        //below method support sqltext and procedure

                        #region ExecuteReader
                        /*
                         parms的作用,這也是一個(gè)知識(shí)點(diǎn)
                         舉例:
                         ExecuteReader(*,*,null)成功運(yùn)行
                         ExecuteReader(*,*,new SqlParameter(*))成功運(yùn)行
                         ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))成功運(yùn)行
                         ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})成功運(yùn)行
                         它讓參數(shù)類型和參數(shù)個(gè)數(shù)任意
                         這可給了不是一般的好處,你不必為SqlParameter和SqlParameter[]進(jìn)行重載,寫上兩個(gè)函數(shù)
                         又為null寫上一個(gè)函數(shù),因?yàn)閚ull會(huì)不明確調(diào)用SqlParameter的函數(shù)還是SqlParameter[]的函數(shù)
                         啥你不知道我在說什么,打屁屁,那回去看看c++的函數(shù)重載
                         */
                        public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
                      
                            SqlCommand cmd = new SqlCommand();

                            try {
                                PrepareCommand(cmd, null, cmdType, cmdText, commandParameters);
                                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                                cmd.Parameters.Clear();
                                return rdr;
                            }
                            catch {
                                Close();
                                throw;
                            }
                        }
                        #endregion

                        #region ExecuteNonQuery
                        public static void ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                            SqlCommand cmd = new SqlCommand();

                            PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                            cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();

                            Close();
                        }
                        #endregion

                        #region ExecuteScalar
                        public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                            SqlCommand cmd = new SqlCommand();

                            PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                            object val = cmd.ExecuteScalar();
                            cmd.Parameters.Clear();

                            Close();
                            return val;
                        }
                        #endregion


                    }
          }

          posted @ 2007-12-26 10:30 風(fēng)雨兼程 閱讀(909) | 評(píng)論 (0)編輯 收藏

          框架怎樣實(shí)現(xiàn)高度隨內(nèi)容自動(dòng)增高

          main.htm:

          <html> 
              <head> 
                 <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' /> 
                 <meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' /> 
                 <title>iframe自適應(yīng)加載的頁面高度</title> 
              </head> 
              
              <body>
                  <div><iframe src="child.htm"></iframe></div>
              </body>
          </html>

          child.htm:

          <html> 
          <head> 
              <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' /> 
              <meta  name='author'  content='F.R.Huang(meizz梅花雪)//www.meizz.com' /> 
              <title>iframe  自適應(yīng)其加載的網(wǎng)頁(多瀏覽器兼容)</title> 
              <script type="text/javascript">
              <!--
              function iframeAutoFit()
              {
                  try
                  {
                      if(window!=parent)
                      {
                          var a = parent.document.getElementsByTagName("IFRAME");
                          for(var i=0; i<a.length; i++) //author:meizz
                          {
                              if(a[i].contentWindow==window)
                              {
                                  var h1=0, h2=0;
                                  a[i].parentNode.style.height = a[i].offsetHeight +"px";
                                  a[i].style.height = "10px";
                                  if(document.documentElement&&document.documentElement.scrollHeight)
                                  {
                                      h1=document.documentElement.scrollHeight;
                                  }
                                  if(document.body) h2=document.body.scrollHeight;

                                  var h=Math.max(h1, h2);
                                  if(document.all) {h += 4;}
                                  if(window.opera) {h += 1;}
                                  a[i].style.height = a[i].parentNode.style.height = h +"px";
                              }
                          }
                      }
                  }
                  catch (ex){}
              }
              if(window.attachEvent)
              {
                  window.attachEvent("onload",  iframeAutoFit);
                  //window.attachEvent("onresize",  iframeAutoFit);
              }
              else if(window.addEventListener)
              {
                  window.addEventListener('load',  iframeAutoFit,  false);
                  //window.addEventListener('resize',  iframeAutoFit,  false);
              }
              //-->
              </script> 
          </head> 
          <body>
              <table border="1" width="200" style="height: 400px; background-color: yellow">
                  <tr>
                      <td>iframe  自適應(yīng)其加載的網(wǎng)頁(多瀏覽器兼容,支持XHTML)</td>
                  </tr>
              </table>
          </body> 
          </html>

           很多人反應(yīng)在IE7里使用它會(huì)死機(jī),那是因?yàn)樵谧赃m應(yīng)高度時(shí)觸發(fā)了 window.onresize 事件,而這個(gè)事件又去調(diào)用這個(gè)調(diào)整 <iframe> 高度的函數(shù),產(chǎn)生了死循環(huán)調(diào)用。

          posted @ 2007-04-29 18:03 風(fēng)雨兼程 閱讀(1001) | 評(píng)論 (1)編輯 收藏

          怎樣向xml文檔插入HTML標(biāo)記

          CDATA 區(qū)段
                 因?yàn)榫W(wǎng)頁中要顯示HTML的源代碼。而在XML中,要實(shí)現(xiàn)這樣的功能,就必須使用CDATA標(biāo)記。在CDATA標(biāo)記中的信息被解析器原封不動(dòng)地傳給應(yīng)用程序,并且不解析該段信息中的任何控制標(biāo)記。CDATA區(qū)域是由:![CDATA[”為開始標(biāo)記,以“]]為結(jié)束標(biāo)記。例如:例2中的源碼,除了![CDATA[”“]]符號(hào),其余的內(nèi)容解析器將原封不動(dòng)地交給下游的應(yīng)用程序,即使CDATA區(qū)域中的開始和結(jié)尾的空白以及換行字符等,都同樣會(huì)被轉(zhuǎn)交(注意CDATA是大寫的字符)。 

              如同你在第三章中學(xué)到的,你不能直接將(<)或(&)符號(hào)放置在元素內(nèi)容中的字符數(shù)據(jù)里。要避開這個(gè)限制的一種方法是使用字符參照(& #60;或& #38;)或預(yù)先定義的普通實(shí)體參照(& lt;或& amp;),如同你在第六章中將學(xué)到的。然而,如果你需要加入多個(gè)(<)或(&)字符,使用這些參照將變得不合適且會(huì)讓資料變得難以閱讀。在這種情況下,將包含限制字符的文字放置在CDATA 區(qū)段中將會(huì)比較容易完成工作。
              CDATA 區(qū)段的類型
              CDATA 區(qū)段以字符「<![CDATA[」開始,并以「]]>」字符結(jié)束。在這兩個(gè)定義符號(hào)之間,你可以輸入任何字符(包括「<」或「&」),除了「]]>」之外。(因?yàn)椋撟址麜?huì)被解釋成CDATA區(qū)段的結(jié)束。)所有位在CDATA 區(qū)段中的字符都被視為元素字符數(shù)據(jù)的字義 (literal) 部分,而不是XML 標(biāo)簽。
              下面是一個(gè)合法CDATA 區(qū)段的范例:
          <![CDATA [
          Here you can type any characters except two right brackets followed
          by a greater-than symbol.
          ]]>
          注意
              關(guān)鍵詞CDATA,就像其它你所見到的XML 關(guān)鍵詞,必須以大寫字母撰寫。
              如果你想包含一段原始碼或標(biāo)簽當(dāng)作被顯示在瀏覽器中元素的真實(shí)字符數(shù)據(jù)的一部份,你可以使用CDATA 區(qū)段來防止XML 解析器將「<」或「&」字符解釋成XML 卷標(biāo)。下面就是一個(gè)范例:
          <A-SECTION>
          The following is an example of a very simple HTML page:
          <![CDATA[
          <HTML>
          <HEAD>
          <T99vLE>R.Jones &Sons</T99vLE>
          </HEAD>
          <BODY>
          <P>Welcome to our home page!</P>
          </BODY>
          </HTML>
          ]]>
          </A-SECTION>
              例如,若沒有CDATA 區(qū)段,處理器會(huì)假設(shè)<HTML>是套迭的元素的起始部分,而不是A-SECTION 元素的字符數(shù)據(jù)的起始部分。
          注意
              既然你可以直接將「<」與「&」字符加入CDATA 區(qū)段中,你就不必使用字符參照(& #60;與&)或預(yù)先定義的普通實(shí)體參照(& lt;與& amp;),筆者將在第六章中解釋字符參照與實(shí)體參照。事實(shí)上,如果你使用這類的參照,解析器會(huì)將參照中的每個(gè)字符照字面解釋,且不會(huì)更換掉含有「<」或「&」字符的參照。
              你可以放置CDATA 區(qū)段的地方
              你可以將CDATA 區(qū)段放置在字符數(shù)據(jù)可以出現(xiàn)的任何地方-也就是說,在元素的內(nèi)容中卻不在XML 標(biāo)簽中。下面是一個(gè)合法放置CDATA 區(qū)段的范例
          <?xml version="1.0"?>
          <MUSICAL>
          <T99vLE_PAGE>

           

          <![CDATA[
          <Oklahoma!>
          By
          Rogers &Hammerstein
          ]]>
          </T99vLE_PAGE>
          <!--Other elements here...-->
          </MUSICAL>
              顯示于下頁的錯(cuò)誤型式XML 文件包含了兩個(gè)違法的CDATA 區(qū)段。第一個(gè)不是在元素的內(nèi)容中。第二個(gè)則是位在文件元素的內(nèi)容之中,但卻不是在起始標(biāo)簽中。
          <?xml version="1.0"?>
          <![CDATA[ ILLEGAL::not within element content!]]>
          <DOC_ELEMENT>
          <SUB_ELEMENT <![CDATA[ ILLEGAL::inside of markup!]]>>
          sub-element content...
          </SUB_ELEMENT>
          </DOC_ELEMENT>
          注意
              CDATA 區(qū)段不能成巢狀套迭。亦即,你不能將一個(gè)CDATA 區(qū)段放到另一個(gè)區(qū)段中。

          posted @ 2007-04-29 17:42 風(fēng)雨兼程 閱讀(1851) | 評(píng)論 (0)編輯 收藏

          三 生 三 世

          前生,你以緋紅的思念,偎依我的窗前,將一生的愛戀開放成桃花一片。

          ????你深情的佇立在早春三月,以燦爛溫暖我冬季曾經(jīng)冰封的心河。你將錚錚的誓言,以千枝萬條纏繞在我的窗前,你將依戀深鎖在每一朵花心,呈以幽香親吻我的氣息。

          ????隔窗,是我纖纖的倩影,以一雙翦水的眼眸將你一片迷醉的桃紅粉成癡癡的凝望。在微風(fēng)細(xì)雨里,你致以我呢喃的細(xì)語,那雨滴落在花瓣上的顫音是你為我譜寫的相思曲。懵懂的我,總是憑窗而立,期待一襲青衫從幽香裊繞的花樹下,以熱切的眼眸向我走來。紅塵中的我,卻看不穿你糾結(jié)滿樹的想我的情結(jié)。終究,你在屬于自己季節(jié)的尾聲,隔窗,用最后眷戀的眼光,在不舍與哀傷中碎落我的窗下,看著你飄零的身軀,撞入我心扉的是來得深刻而猛烈的疼痛,急促地伸出手,想接住你,在錯(cuò)過的瞬間,有淚從眼中滴落……。愛,總在失去的瞬間才知道它的存在。含淚,我祈禱來生也盛開成一簇桃花,與你臨風(fēng)偎依,還你一生的情。?
            
          ????前生,我是桃花一片,以最美的姿色開滿你路過的青石小徑,將一生的眷戀開放成寂寞的等待。等你瀟灑的身影路過時(shí),輕撫我的臉龐,給我一聲愛憐的贊嘆,我以香為魂,伴你在花叢中留戀,聽你為我賦詩,為我吹笛。當(dāng)你每次轉(zhuǎn)身離去時(shí),我在微風(fēng)中心碎的聲音,你是否聽見?總在無你的夜晚獨(dú)自浴著冷月的清輝想你,思念便凋落成滿地憔悴的容顏,清晨,花瓣上的露珠便是我為你流了一夜的淚。?

          ???我寂寞而又充滿期待地等著你經(jīng)過,貪戀地呼吸著有你的空氣,眷戀著你身上發(fā)出來的味道,有一種依偎的感覺和莫名的幸福。雖然我不能表達(dá)對(duì)你的所有的愛戀,只能無語地看著你來去匆忙的身影,你為我的每次駐足和停留,都讓我感動(dòng)和欣喜萬分,你的憂郁的長嘆總牽動(dòng)我的心弦,在你看不見里為你暗自落淚。如果可以,我多么希望就這樣在這里靜默地守侯,守侯朝來暮去的時(shí)光里有你的身影陪伴,與你偕老。

          ???我只有一季短暫的生命和一顆愛你的心,在不屬于我的季節(jié)即將來臨之際,我將離去。雖然我有深深的眷戀和離別的傷痛,可是,生命不容我為你停留。就讓我在季節(jié)最后的晨光里,以飛舞的姿勢(shì)婆娑而落,在你嗚咽的笛音里慢慢凋零在你的指尖……。我祈禱來生不再為花,許我能語言可以向你傾訴。

          ???今生,我是桃樹下畫花的女子,就著一襲白色長裙,拈一朵桃花簪入發(fā),染幾筆丹青,將你我的姻緣寫進(jìn)花瓣,等著能解花語的你飄然而來,執(zhí)我之手,與我傾訴,共我繾綣。

          ???不許愿來世相見,不求一生擁有,只愿今生有緣能與你攜手相擁,走過一段人生。我以三生的情,換你一生的緣,只是不愿再錯(cuò)過生命中的一段情緣。

          posted @ 2007-02-26 14:05 風(fēng)雨兼程 閱讀(186) | 評(píng)論 (0)編輯 收藏

          一個(gè)關(guān)于模態(tài)彈出窗口刷新父窗體的問題。急

          問:
          我在做一套系統(tǒng)的時(shí)候碰到這樣一個(gè)問題。
          彈出的模態(tài)窗口不能刷新父窗體。例如我新增數(shù)據(jù)是在模態(tài)窗口而添加成功了關(guān)閉后父窗體只能手動(dòng)刷新。這樣就嚴(yán)重影響了一些效果。
          我嘗試過一些方法但是始終不對(duì)。請(qǐng)各位高手進(jìn)來一下。

          用OPEN打開的不管是在關(guān)閉窗體時(shí)自動(dòng)刷新都沒有任何問題。見下例

          父窗體代碼
          <%@ page contentType="text/html; charset=GBK" %>
          <html>
          <head>
          <title></title>
          </head>
          <body>
          <a href="javascript:void(0)" onclick="window.open('2.html','','')">open</a>
          </body>
          </html>

          子窗體代碼
          <%@ page contentType="text/html; charset=GBK" %>
          <html>
          <head>
          <title></title>
          </head>
          <body onUnload="opener.location.reload()">
          <!-
          用按紐直接刷新父窗體
          <a href="javascript:opener.location.reload()">刷新</a>
          ->
          </body>
          </html>

          ?

          換做模態(tài)后的程序。
          父窗體代碼
          <%@ page contentType="text/html; charset=GBK" %><HEAD>
          <body onUnload="opener.location.reload()">
          <script language="JavaScript">
          function showabout()
          {
          ? var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
          }?
          void(0);
          </script>
          <a href="javascript:void(0)" onClick="showabout()">open</a>

          子窗體代碼
          <%@ page contentType="text/html; charset=GBK" %>
          <html>
          <head>
          <title></title>
          </head>
          <body onUnload="opener.location.reload()">
          <a href="javascript:opener.location.reload()">刷新</a>
          </body>
          </html>

          ?

          請(qǐng)各位參考一下上面的代碼,我感覺錯(cuò)誤好象是出在
          opener.location.reload()

          謝謝
          ______________________________________________________________________________________________
          答1:
          模態(tài)窗口不能在子窗口中直接刷新父窗口

          父窗體代碼
          <%@ page contentType="text/html; charset=GBK" %><HEAD>
          <body onUnload="opener.location.reload()">
          <script language="JavaScript">
          function showabout()
          {
          ? var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
          ? location.reload()//模態(tài)窗口傳值下來后就可以刷新了.
          }?
          void(0);
          </script>
          <a href="javascript:void(0)" onClick="showabout()">open</a>

          子窗體代碼
          <%@ page contentType="text/html; charset=GBK" %>
          <html>
          <head>
          <title></title>
          </head>
          <body onUnload="opener.location.reload()">
          <a href="javascript:opener.location.reload()">刷新</a>//???在子窗口中不能刷新父窗口,只有window.close下去后才可刷新.
          </body>
          </html>

          ______________________________________________________________________________________________
          答2:
          模態(tài)對(duì)話框是不能用opener引用父窗口的,而是需要父窗口主動(dòng)傳遞指針變量的
          這個(gè)window.showModalDialog有第二個(gè)參數(shù),就是做這個(gè)用的,你需要把window穿過去,就是這樣
          var returnValue=showModalDialog('2.html',window,'dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
          這樣在對(duì)話框中就可以引用父窗口對(duì)象,怎么引用呢,通過window.dialogArgument就可以應(yīng)用父窗口了。

          ______________________________________________________________________________________________
          答3:
          謝謝。我終于搞定了。
          上面的dialogArgument差個(gè)S
          我調(diào)了半天。發(fā)現(xiàn)在body里面應(yīng)該加上location
          也就是<body onUnload="window.dialogArguments.location.reload()">

          posted @ 2007-02-09 14:48 風(fēng)雨兼程 閱讀(5891) | 評(píng)論 (4)編輯 收藏

          asp.net中動(dòng)態(tài)變更CSS

          在asp.net中,有的時(shí)候要?jiǎng)討B(tài)變換CSS,比如有的時(shí)候做個(gè)性化頁面,可以這樣做
          <head>
          <link id="MyStyleSheet" rel="stylesheet" type="text/css" runat="server" />
          </head>
          之后,在要更換CSS的頁面中,使用如下代碼
          Sub Page_Load(Sender As Object, E As EventArgs)
          If Not (IsPostBack)
          MyStyleSheet.Attributes.Add("href","/css/flostyle.css")
          End If
          End Sub??

          posted @ 2007-02-09 13:09 風(fēng)雨兼程 閱讀(224) | 評(píng)論 (0)編輯 收藏

          動(dòng)態(tài)改變Asp.net頁面標(biāo)題

          1.引用命字空間
          use System.Web.UI.HtmlControls.HtmlGenericControl
          在Asp.net 中你可以使用HtmlGenericControl()來動(dòng)態(tài)改變頁面Title(標(biāo)題)



          2.為HTML Title標(biāo)簽設(shè)置ID,并將其作為服務(wù)器端運(yùn)行
          <HTML>
          ??<HEAD>
          ????<TITLE ID=MyPageTitle Runat=Server> </TITLE>
          ??</HEAD>
          ?<BODY>
          ??</BODY>
          </HTML>



          3.將Title標(biāo)設(shè)設(shè)為Runat=server后,就可以后臺(tái)代碼進(jìn)行訪問~~,通過InnerText或InnerHtml
          來改變其值.
          public class Use_This : System.Web.UI.Page
          ?{
          ??
          Private System.Web.UI.HtmlControls.HtmlGenericControl SetMyTitle;
          ??private void Page_Load(object sender, System.EventArgs e)
          ??{

          ?? SetMyTitle.InnerText = "~哈哈~";

          ??}
          }


          posted @ 2007-02-09 13:08 風(fēng)雨兼程 閱讀(403) | 評(píng)論 (1)編輯 收藏

          怎樣實(shí)現(xiàn)動(dòng)態(tài)添加刪除表單中的行

          <script LANGUAGE="JAVASCRIPT">
          var i= 0;
          var a = 0;
          function insertRow(){
           var otr=myTable.insertRow(myTable.rows.length);
           var ocell=otr.insertCell(0);
           ocell.innerHTML="<input type=file name='f1'+a+''>"
           var ocell=otr.insertCell(1);
          ?? ocell.innerHTML="<input type=file name='f2'+a+''>"
          ?? var ocell=otr.insertCell(2);
          ?? ocell.innerHTML="<input type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
          ?? i++;
          ?? a++;
          }
          </SCRIPT>
          </HEAD>
          <BODY>
          <table id="myTable" border=1 width=600 >
          </table>
          <input type=button onclick="insertRow()"  value="插入行">
          </BODY>

          2
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          <title>添加刪除行</title>
          </head>

          <body><script LANGUAGE="JAVASCRIPT">
          var j= 1;
          var i= 0;
          var a = 0;
          function insertRow(){
           var otr=myTable.insertRow(myTable.rows.length);
           ??? var ocell=otr.insertCell(0);?????????????????????????????????????????
            ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text? size='12' maxlength='7'name='num"+a+"'>"
           ??? var ocell=otr.insertCell(1);
          ?? ocell.innerHTML="<select name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
          ????? var ocell=otr.insertCell(2);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+j+"'>"
          ????? var ocell=otr.insertCell(3);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
          ????? var ocell=otr.insertCell(4);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
          ????? var ocell=otr.insertCell(5);?
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"?????
          ???? var? ocell=otr.insertCell(6);
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
          ?? j++;
          ?? i++;
          ?? a++;
          }
          </SCRIPT>
          </HEAD>
          <BODY>
          <table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
          ? <tr>
          ??? <td><div align="center">號(hào)碼</div></td>
          ??? <td nowrap><div align="center">寬度類型</div></td>
          ??? <td nowrap><div align="center">起始時(shí)間</div></td>
          ??? <td nowrap><div align="center">優(yōu)惠時(shí)間</div></td>
          ??? <td nowrap><div align="center">優(yōu)惠金額</div></td>
          ??? <td nowrap><div align="center">備注</div></td>
          ??? <td nowrap><div align="center">刪除</div></td>
          ? </tr>
          </table>
          <p align="center">
          ? <input type=button onclick="insertRow()"value="插入行">
          </p>

          <p>&nbsp;</p>
          </BODY>

          </body>
          </html>

          3
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          <title>添加刪除行</title>
          </head>

          <body><script LANGUAGE="JAVASCRIPT">
          var i= 0;
          var a = 0;
          function insertRow(){
           var otr=myTable.insertRow(myTable.rows.length);
           ??? var ocell=otr.insertCell(0);?????????????????????????????????????????
            ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text? size='12' maxlength='7'name='num"+a+"'>"
           ??? var ocell=otr.insertCell(1);
          ?? ocell.innerHTML="<select onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
          ????? var ocell=otr.insertCell(2);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+a+"'>"
          ????? var ocell=otr.insertCell(3);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
          ????? var ocell=otr.insertCell(4);?????????????????????????????????????????
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
          ????? var ocell=otr.insertCell(5);?
          ?? ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"?????
          ???? var? ocell=otr.insertCell(6);
          ?? ocell.innerHTML="<input type=button name='del'+a+'' value=刪除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"

          ?? i++;
          ?? a++;
          }
          function deleteRow()
          {
          ?? tr=document.getElementById("myTable").rows;
          ?? if(tr.length>1)tr[tr.length-1].removeNode();
          }
          </SCRIPT>
          </HEAD>
          <BODY>
          <table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
          ? <tr>
          ??? <td><div align="center">號(hào)碼</div></td>
          ??? <td nowrap><div align="center">寬度類型</div></td>
          ??? <td nowrap><div align="center">起始時(shí)間</div></td>
          ??? <td nowrap><div align="center">優(yōu)惠時(shí)間</div></td>
          ??? <td nowrap><div align="center">優(yōu)惠金額</div></td>
          ??? <td nowrap><div align="center">備注</div></td>
          ??? <td nowrap><div align="center">刪除</div></td>
          ? </tr>
          </table>
          <p align="center">
          ? <input type=button onclick="insertRow()"value="插入行">
          ? <input type=button onclick="deleteRow()"value="刪除行">
          </p>

          <p>&nbsp;</p>
          </BODY>

          </body>
          </html>

          posted @ 2007-01-29 18:58 風(fēng)雨兼程 閱讀(1219) | 評(píng)論 (0)編輯 收藏

          文件上傳

          ?function OutputUpload(id,title) { var tblMain=document.getElementById("Table2"); var tbl=document.getElementById("Table3"); var isExsitfile=document.getElementById("file"+id); var text=document.createTextNode("上傳:"+title+"虛擬形象圖片"); if(isExsitfile==null) { var str= ""; tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ; tbl.rows[id].cells[0].appendChild(text); } else { tbl.rows[id].cells[0].removeChild(isExsitfile); tbl.rows[id].cells[0].innerText=""; } }

          if(Request.Form["CHK"]!=null)
          ???{?? string chkvalue=Request.Form["CHK"].ToString();
          ????string[] mylayer=chkvalue.Split(new char[]{','});
          ????string layer="";
          ????for(int i=0;i<mylayer.Length;i++)
          ????{?????
          ?????
          ?????if(layer!="")
          ?????{
          ??????layer+="_";
          ?????}
          ?????layer+=mylayer[i];
          ?????
          ????}
          ????ViewState["layer"]=layer;
          ??????
          ????//得到數(shù)據(jù)庫編號(hào)
          ????if(itemid1.ToString()==null)
          ????{
          ?????itemid1=itemid1+1;
          ????}
          ????else
          ????{
          ?????itemid1=GetItemID()+1;
          ????}
          ????System.Web.HttpFileCollection files=System.Web.HttpContext.Current.Request.Files;
          ????try
          ????{
          ?????for(int i=0;i<files.Count;i++)
          ?????{??
          ??????string fid=itemid1+".gif";
          ??????HttpPostedFile postedFile=files[i];
          ??????
          ??????if(postedFile.FileName.Length>0)
          ??????{
          ???????string fileName,fileExtension;
          ???????fileName=System.IO.Path.GetFileName(postedFile.FileName);
          ???????fileExtension=System.IO.Path.GetExtension(fileName);

          ???????if(fileExtension!=GlobalVars.FILETAILNAME[0])
          ???????{
          ????????Response.Write("<script>alert(\"文件格式不正確!!!\")</script>");
          ????????return;
          ???????}
          ???????if(i==0)
          ???????{
          ????????//上傳圖片到服務(wù)器上??
          ????????BLL.Visual_Items bll=new BLL.Visual_Items();
          ????????bool tf=bll.Exists(this.txtName.Text);
          ????????if(tf==false)
          ????????{??
          ?????????if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0"))
          ?????????{
          ??????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid);?
          ?????????}
          ?????????else
          ?????????{
          ??????????System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0");
          ??????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid);?
          ?????????}
          ?????????// 把圖片的信息記錄保留到數(shù)據(jù)庫中
          ?????????string s="images/img_Visual/show/0/"+fid;
          ?????????AddData(s,itemid1,layer);

          ????????}
          ????????else
          ????????{
          ?????????this.Response.Write("<script>alert('數(shù)據(jù)庫已存在此條數(shù)據(jù)!')</script>");
          ????????}

          ???????}
          ???????else
          ???????{
          ????????if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]))
          ????????{
          ?????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);
          ????????}
          ????????else
          ????????{
          ?????????System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]);
          ?????????postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);

          ????????}
          ???????}
          ??????}
          ??????else
          ??????{
          ???????Response.Write("<script>alert(\"虛擬形象圖片不能為空!\")</script>");
          ???????return ;

          ??????}
          ?????}?
          ????}
          ????catch(Exception ex)
          ????{
          ?????string sRawURL = Request.RawUrl;

          ?????if(sRawURL.IndexOf("?") > -1)
          ?????{
          ??????sRawURL = sRawURL.Substring(0,sRawURL.IndexOf("?"));
          ?????}????
          ?????
          ?????Response.Write(ex.ToString());
          ????}?
          ???}
          ???else
          ???{
          ?????????????? Response.Write("<script>alert(\"請(qǐng)選擇虛擬形象所屬層!!\")</script>");
          ???}

          posted @ 2006-12-16 11:31 風(fēng)雨兼程 閱讀(244) | 評(píng)論 (0)編輯 收藏

          構(gòu)建安全的數(shù)據(jù)訪問

               摘要: 本頁內(nèi)容http://www.microsoft.com/china/technet/security/guidance/secmod87.mspx 本模塊內(nèi)容 ...  閱讀全文

          posted @ 2006-11-17 15:08 風(fēng)雨兼程 閱讀(430) | 評(píng)論 (0)編輯 收藏

          DataGrid使用技巧小總結(jié)-個(gè)性化分頁及復(fù)雜表頭

          ? 在使用DataGrid 的時(shí)候,總是會(huì)有各種各樣的需求,在和數(shù)據(jù)庫打交道的項(xiàng)目中用的最多的恐怕就屬DataGrid 了吧,微軟有時(shí)候做的就差那么一點(diǎn)點(diǎn),所以就需要我們自己來動(dòng)手實(shí)現(xiàn)啦.

          DataGrid 自定義分頁導(dǎo)航

          無需任何其他第三方控件,在DataGrid 自己分頁的基礎(chǔ)上再個(gè)性化一點(diǎn).
          效果:??

          讓DataGrid自己的分頁實(shí)現(xiàn)這樣的效果
          [1][2][3][4][5][6]

          ??

          讓DataGrid自己的分頁實(shí)現(xiàn)這樣的效果
          [1][2][3][4][5][6]

          ??

          private void grid_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
          ??{
          ???if(e.Item.ItemType==ListItemType.Pager)
          ???{????
          ????foreach (Control c in e.Item.Cells[0].Controls)
          ????{
          ?????if (c is Label)? //
          當(dāng)前頁數(shù)
          ?????{
          ??????? Label lblpage=(Label)c;
          //??????lblpage.ForeColor= System.Drawing.ColorTranslator.FromHtml("#e78a29");?//#e78a29 ,#FF0000?????
          //??????lblpage.Font.Bold=true;
          ??????? lblpage.Text="[<font color=#e78a29><b>"+lblpage.Text+"</b></font>]";?????
          ??????//((Label)c).ForeColor = System.Drawing.Color.Green;??????
          //??????break;
          ?????}
          ?????if(c is LinkButton) //
          鏈接的其他頁數(shù)
          ?????{??????
          ???????? LinkButton linkButton = (LinkButton)c; ??????
          ???????? linkButton.Text = "[" + linkButton.Text+"]";
          ?????}
          ????}????
          ???}
          ??}

          ?

          ?

          DataGrid等控件中的自動(dòng)編號(hào):

          添加一個(gè)模版列:

          <asp:TemplateColumn?HeaderText="No.">
          ????
          <ItemStyle?HorizontalAlign="Center"></ItemStyle>
          ????
          <ItemTemplate>
          ????????
          <asp:Label?runat="server"?Text='<%#?dgCustomize.CurrentPageIndex*dgCustomize.PageSize+dgCustomize.Items.Count+1?%>'>
          ????????
          </asp:Label>
          ????
          </ItemTemplate>
          </asp:TemplateColumn>

          ?

          ?

          DataGrid中創(chuàng)建復(fù)雜表頭

          方法一:用table實(shí)現(xiàn)

          ??<form id="Form1" method="post" runat="server">
          ???<TABLE id="Table1" runat="server" cellSpacing="1" cellPadding="2" width="580" border="1"
          ????bgcolor="#cc6633" bordercolor="#cc9966" style="FONT-SIZE:9pt;BORDER-BOTTOM:0px">
          ????<TR align="center">
          ?????<TD colspan="2" width="380" style="HEIGHT: 21px"></TD>
          ?????<TD width="200" colspan="2" style="HEIGHT: 21px"></TD>
          ????</TR>
          ????<TR align="center">
          ?????<TD width="200" bgcolor="#66cc99"><FONT face="
          宋體"></FONT></TD>
          ?????<TD width="180" bgcolor="white"><FONT face="
          宋體"></FONT></TD>
          ?????<TD width="160" bgcolor="#99cccc"></TD>
          ?????<TD width="40" bgcolor="#009999"></TD>
          ????</TR>
          ???</TABLE>
          ???<asp:DataGrid id="DataGrid1" width="580px" AlternatingItemStyle-BackColor="#6699ff" CellPadding="2"
          ????CellSpacing="1" BorderWidth="1" BorderColor="#cc9966" Font-Size="9pt" runat="server" ShowHeader="False"
          ????AutoGenerateColumns="False">
          ????<Columns>
          ?????<asp:BoundColumn DataField="Title">
          ??????<ItemStyle Width="200px"></ItemStyle>
          ?????</asp:BoundColumn>
          ?????<asp:BoundColumn DataField="CreateDate">
          ??????<ItemStyle Width="180px"></ItemStyle>
          ?????</asp:BoundColumn>
          ?????<asp:BoundColumn DataField="pid">
          ??????<ItemStyle Width="160px"></ItemStyle>
          ?????</asp:BoundColumn>
          ?????<asp:BoundColumn DataField="HitCount">
          ??????<ItemStyle Width="40px"></ItemStyle>
          ?????</asp:BoundColumn>
          ????</Columns>
          ???</asp:DataGrid>???
          ??</form>?

          窗體頂端

          ?

          ?

          ?

          ?

          ?

          ?

          窗體底端

          方法二:動(dòng)態(tài)生成表頭

          生成雙層表頭:
          ??private void grid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
          ??{

          ???if (e.Item.ItemType == ListItemType.Header)
          ???{
          //????e.Item.Cells[0].ColumnSpan = 1;//
          這是第一列的跨列數(shù)
          ????StringBuilder strtext=new StringBuilder();
          ????strtext.Append("\\</td>");
          ????strtext.Append("<td colspan=4>
          生活照明</td>");
          ????strtext.Append("<td colspan=2>
          一般照明</td>");
          ????strtext.Append("<td colspan=2>
          工付業(yè)</td>");
          ????strtext.Append("<td colspan=2>
          農(nóng)業(yè)</td>");
          ????strtext.Append("<td colspan=2>
          合計(jì)</td>");
          ????strtext.Append("</tr>");
          ????strtext.Append("<tr>");
          ????strtext.Append("<td>" + e.Item.Cells[0].Text);???????????????
          ????e.Item.Cells[0].Text =strtext.ToString();

          ???}

          }

          整個(gè)表頭內(nèi)容:<tr><td>??e.Item.Cells[0].Text =的內(nèi)容? </td></tr>

          加起來就是表頭的樣式。

          生活照明

          一般照明

          工付業(yè)

          農(nóng)業(yè)

          合計(jì)

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          生成三層表頭:

          if (e.Item.ItemType == ListItemType.Header)
          ???{????
          ????StringBuilder strtext=new StringBuilder();
          ????strtext.Append("</td>");
          ????strtext.Append("<td colspan= 6>
          當(dāng)月</td>");
          ????strtext.Append("</tr>");

          ????strtext.Append("<tr>");?
          ????strtext.Append("<td colspan=2>
          居民</td>");
          ????strtext.Append("<td colspan=2>
          一般</td>");
          ????strtext.Append("<td colspan=2>
          工付業(yè)</td>");
          ????strtext.Append("</tr>");

          ????strtext.Append("<tr>");
          ????strtext.Append("<td>" + e.Item.Cells[0].Text);???????????????
          ????e.Item.Cells[0].Text =strtext.ToString();
          ???}

          當(dāng)月

          居民

          一般

          工付業(yè)

          ?

          ?

          ?

          ?

          ?

          ?

          posted @ 2006-11-10 14:31 風(fēng)雨兼程 閱讀(278) | 評(píng)論 (0)編輯 收藏

          Datagrid怎么根據(jù)選擇的checkbox編輯和更新多行記錄?

               摘要: 網(wǎng)友問這個(gè)問題,寫了一個(gè)簡單的例子:前臺(tái):??1<%@?Page?language="c#"?Codebehind="WebForm4.aspx.cs"?AutoEventWireup="false"?Inherits="WebApplication25.WebForm4"?%>??2<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.0?Tran...  閱讀全文

          posted @ 2006-11-10 14:28 風(fēng)雨兼程 閱讀(391) | 評(píng)論 (0)編輯 收藏

          2006年it人士必去的10個(gè)網(wǎng)站

          1、chinaunix
          網(wǎng)址:http://www.chinaunix.net/
          簡介:中國最大的linux/unix技術(shù)社區(qū)。

          2、itpub
          網(wǎng)址:http://www.itpub.net/
          簡介:有名氣的IT技術(shù)論壇,看看它的alexa排名就知道有多火了,尤其以數(shù)據(jù)庫技術(shù)討論熱烈而聞名。ITPUB論壇的前身是建立在smiling的oracle小組。

          3、51cto
          網(wǎng)址:http://www.51cto.com/
          簡介:由國內(nèi)知名IT門戶網(wǎng)站管理團(tuán)隊(duì),獲近千萬風(fēng)險(xiǎn)投資,于2005年8月正式創(chuàng)立,是國內(nèi)首家定位于網(wǎng)絡(luò)技術(shù)人員的綜合性服務(wù)平臺(tái),是中國最大的網(wǎng)絡(luò)技術(shù)網(wǎng)站。

          4、csdn
          網(wǎng)址:http://www.csdn.net/
          簡介:于1999年3月成立,是中國最大的軟件開發(fā)人員網(wǎng)站,社區(qū)熱心高手眾多,并有不少M(fèi)VP(微軟最有價(jià)值專家)長期活躍在這里,類似懸賞的積分制度,也使論壇增添不少樂趣。

          5、落伍者
          網(wǎng)址:http://www.im286.com/
          簡介:網(wǎng)站站長都應(yīng)該知道的地方,只是論壇id需要手工審核。

          6、藍(lán)色理想
          網(wǎng)址:http://www.blueidea.com/
          簡介:有名的關(guān)于網(wǎng)站設(shè)計(jì)的網(wǎng)站,擁有大量忠實(shí)網(wǎng)友。

          7、it寫作社區(qū)
          網(wǎng)址:http://www.donews.com/
          簡介:一個(gè)可以讓你的思維活躍起來的地方,在這里it評(píng)論人和撰稿人可以找到很多的文字素材。

          8、博客堂
          網(wǎng)址:http://blog.joycode.com/
          簡介:眾多MVP交流的地方,這里有各類最新技術(shù),只是網(wǎng)站成員采用邀請(qǐng)制,不提供注冊(cè)或者申請(qǐng)功能。

          9、it英雄榜
          網(wǎng)址:http://www.itheroes.cn/
          簡介:網(wǎng)站以介紹it界人士為主,廣大從事it的人員可以從中獲取他們的經(jīng)驗(yàn)。

          10、邪惡八進(jìn)制
          網(wǎng)址:http://www.eviloctal.com/
          簡介:目前為數(shù)不多的一個(gè)討論氣氛濃厚,技術(shù)水平高的網(wǎng)絡(luò)安全網(wǎng)站,邪惡八進(jìn)制信息安全團(tuán)隊(duì)也是一個(gè)管理規(guī)范、人員素質(zhì)高的網(wǎng)絡(luò)安全小組。

          posted @ 2006-11-08 15:14 風(fēng)雨兼程 閱讀(237) | 評(píng)論 (0)編輯 收藏

          datagrid的正反雙向排序

          呵呵,本沒有寫文章之意,看到好友阿好(hbzxf)的文章,也決定把平時(shí)的一些東西寫出來和大家分享!有疏漏之處,敬請(qǐng)大家指教!

          ??? ?在asp.net中利用datagrid控件按列進(jìn)行排序很是方便。可是我們只能單項(xiàng)排序!如果我們需要正反排序那么就需要加入一些代碼控制一下,下面我來詳細(xì)講解一下這個(gè)過程。

          ? 首先我們需要將datagird控件的屬性設(shè)置為 AllowSorting="True",且需要排序列需要制定排序表達(dá)式 eg: SortExpression="kmdm"。設(shè)置好這些,我們進(jìn)入代碼文件,來編寫響應(yīng)排序的事件.

          ? 首先在Page_Load時(shí)間中加入如下代碼:

          ???if (!IsPostBack)
          ???{
          ????if(this.kjkm_dg.Attributes["SortExpression"]==null) //這里kjkm_dg為datagrid?? ID
          ????{
          ?????this.kjkm_dg.Attributes["SortExpression"]="kmdm";? //這里給datagrid增加一個(gè)排序?qū)傩裕夷J(rèn)排序表達(dá)式為kmdm;
          ?????kjkm_dg.Attributes["SortDirection"]="ASC"; //這里給datagrid增加一個(gè)排序方向?qū)傩?且默認(rèn)為升序排列;
          ????}
          ????mikecatbind(); //綁定函數(shù),下面介紹
          ???}

          ??protected void mikecatbind()
          ??{
          ???string sqlStr="select * from zc_kjkm";
          ???DataView dv=new DataView();
          ???
          ???string SortExpression=kjkm_dg.Attributes["SortExpression"];
          ???string SortDirection=kjkm_dg.Attributes["SortDirection"];
          ???dv=us.Bind(sqlStr).Tables[0].DefaultView;? //來自web service的dataset,這里隨便一個(gè)ds就可以;
          ???dv.Sort=SortExpression+" "+SortDirection; //指定視圖的排序方式;
          ???kjkm_dg.DataSource=dv; //指定數(shù)據(jù)源
          ???kjkm_dg.DataBind(); //數(shù)據(jù)綁定

          }

          ?? 進(jìn)行完上面的設(shè)置后我們進(jìn)入重要的環(huán)節(jié),排序事件的編寫:

          ??private void kjkm_dg_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
          ??{
          ???string SortExpression=e.SortExpression.ToString();? //獲得當(dāng)前排序表達(dá)式
          ???string SortDirection="ASC"; //為排序方向變量賦初值
          ???if(SortExpression==kjkm_dg.Attributes["SortExpression"])? //如果為當(dāng)前排序列
          ???{
          ????SortDirection=(kjkm_dg.Attributes["SortDirection"].ToString()==SortDirection?"DESC":"ASC");???? //獲得下一次的排序狀態(tài)

          ?}
          ???kjkm_dg.Attributes["SortExpression"]=SortExpression;
          ???kjkm_dg.Attributes["SortDirection"]=SortDirection;
          ???mikecatbind();
          ??}

          posted @ 2006-11-08 14:53 風(fēng)雨兼程 閱讀(209) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 文化| 谢通门县| 夏邑县| 苏州市| 南丹县| 宜川县| 潢川县| 清流县| 玉树县| 久治县| 宁夏| 连平县| 平和县| 三江| 辰溪县| 凌源市| 泰安市| 岳普湖县| 清镇市| 安徽省| 雅江县| 大城县| 施秉县| 城市| 云梦县| 千阳县| 绥化市| 兴安盟| 德庆县| 剑阁县| 体育| 松桃| 宁化县| 五大连池市| 枝江市| 桐乡市| 平和县| 行唐县| 长白| 永顺县| 抚顺县|