2008年5月21日 星期三

AJAX與ListView的怪現象? --樣版內,控制項ID重複的問題

AJAX與ListView的怪現象? --樣版內,控制項ID重複的問題

這個問題也是我在MSDN論壇回答過的。http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3125960&SiteID=14

Q :ListView裡面的各種樣版,以 ItemTemplate 與 AlternatingItemTemplate這兩個樣版最類似。
如果加上AJAX功能,在這兩個樣版內部,各自加上 UpdatePanel。
很奇怪的是----執行時,會出現錯誤訊息。說 [控制項ID重複?]
取消AJAX的UpdatePanel之後,又好了?真的很奇怪!

重新看了 ListView與SqlDataSource,自動幫我產生的樣版內容(HTML碼)。
沒錯。,這兩個樣版的內容一模一樣啊
不光如此,ListView的各種樣版,裡面各種的 TextBox,ID都是一樣的。
為何不會有錯?但加上AJAX的UpdatePanel就會出錯呢?
...................................................................................................................................

A : 這問題很有趣,所以我也自己測試了一下。
手動去修改 ListView裡面,每個樣版內的 [控制項ID],不要重複就好了。我試過,可以正常執行
我個人的認知如下,未必正確。
傳統POSTBACK的作法,一次只會啟動一個樣版,
所以 ListView各種樣版底下的控制項ID,就算重複也無所謂。
但改成AJAX之後,這時候,每一個控制項ID都必須獨一無二,
不然的話,要怎麼知道是哪一個控制項啟動了非同步的POSTBACK?
我覺得這說法,好像說得通


以上問答,是我在MSDN回答過的問題。
http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3125960&SiteID=14
今天又看見它上了最常查詢問題的排行榜。
所以收錄回自己的BLOG裡面

File 與 Log #2----訪客計數器(用.txt檔案來記錄)

File 與 Log #2----訪客計數器(用.txt檔案來記錄)


以下是即將發表的新書內容:
網站的訪客計數器,也可以用檔案的方式來撰寫。這支程式(Counter.aspx)很簡單也很短,就算您看不懂程式碼,直接 Copy過去用也可以執行。而且執行的結果是以圖片的方式來呈現數字


數字圖片,放在本章範例的 image目錄底下。例如:1的圖片,就名為1lcdb0,gif。2的圖片,就名為2lcdb0,gif……以此類推。

01 Imports ...System.IO
02
03
04
05 Partial Class _Book_My_Files_Counter
06
07 Inherits System.Web.UI.Page
08
09
10
11 Protected Sub Page_Load() Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
12
13 '====讀取檔案 (務必修改這個檔案的權限,需要「寫入」的權限)====
14
15 Dim sr As New StreamReader(Server.MapPath("counter.txt"))
16
17
18
19 '--把檔案內, 原本的訪客人數[加一]
20
21 Dim visitors As String = sr.ReadLine()
22
23 visitors = CInt(visitors) + 1
24
25
26
27 '--把訪客人數(數字) 轉換成 [圖片]展示在畫面上
28
29 Dim Length As Integer = Len(visitors) '--計算訪客人數的[字串長度]
30
31 Dim strURL As String = ""
32
33
34
35 While Length >= 1
36
37 '--訪客人數的每一位數字,都用圖片來呈現。
38
39 strURL = "" & strURL
40
41 Length = Length - 1
42
43 End While
44
45 sr.Close()
46 sr.Dispose()
47
48
49
50 '====寫入檔案,紀錄最新的訪客人數==================
51
52 Dim sw As New StreamWriter(Server.MapPath("counter.txt"))
53
54 sw.WriteLine(visitors) '--找不到檔案也不會出現錯誤訊息,而且會自動新增一個檔案。
55
56 sw.Close()
57 sw.Dispose()
58
59
60 Label1.Text = strURL
61
62 End Sub
63
64 End Class



上面的程式中,比較困難的是 While迴圈的部份。假設訪客人數(visitors)為 999998,我們必須先確定這字串的長度為6(Len(visitors))。然後一個一個地把數字,用圖片的HTML碼()來取代。
我們用一個文字檔來進行記錄,把訪客的參觀數字,記錄在這個檔案(counter.txt)裡面。重點是:務必把這個檔案的權限,設定為「可寫入」。這樣才能每次累計加一,記錄訪客人數。

HTML用來展示圖片的標籤,寫法是:
本範例counter.aspx的後置程式碼很簡單,裡面只作了兩件事而已。第一是讀取counter.txt檔案,取出原本的訪客人數。第二,是把人數加一,然後以圖片方式展現在畫面上,再把更新後的數字寫入檔案。

File 與 Log----ASP.NET的檔案與I/O Stream

File 與 Log----ASP.NET的檔案與I/O Stream
舉例來說,尚未上線的系統、或是有些功能繁雜的程式要撰寫。我們就可以利用檔案的功能來做紀錄。一邊測試一邊記錄這些程式在各階段的運作狀況,每個階段成功與否都可以直接寫入文字檔裡面,不需要跟資料庫搶資源、搶連線。畢竟小檔案I/O的速度,一般來說都快過資料庫。
以前我做過B2B的案子,用Rosettanet XML來傳遞資料(關於Rosettanet,請看中文網站的說明,http://www.rosettanettaiwan.org.tw/)。當時用的技術是 VB 6.0 + ASP + MS BizTalk Server + MS SQL Server 2000。
依照實際的狀況,我們會同時用「檔案」與「資料庫」來記錄這些流程。底下的五大步驟,前三項都會用文字檔做紀錄,因為這些小資料是自己Debug(除錯)用的,往往是系統出問題才會去察看,也不太有保留的價值,所以我們採用文字檔來記錄。
1. 程式定時啟動(例如:每五分鐘啟動一次),並開始記錄處理流程。2. 從資料庫搜尋資料。符合條件的紀錄就撈出來,組合成XML檔案。(執行時間與XML檔案都會存成文字檔,存在專有的目錄底下)3. 將XML檔案,轉換成 Rosettanet格式。(執行時間與Rosettanet XML檔案都會存檔,放在專有的目錄底下)4. 交給 Server準備發送。此時,就會用資料表來記錄時間與相關資料了。5. 傳送給對方的Server。對方收到後,我們也會把時間記錄在資料表裡面。註解:後面兩個流程要用資料表來做紀錄,是為了給客戶與主管查驗,日後也能統計與分析我們這套B2B系統的發送成功率等等。
除了大型的系統、複雜的程序需要做Log紀錄檔之外,網站常用的「訪客計數器」,也可以用檔案的方式來控管。可見存取檔案的用法,真的很多樣化。

以下是即將發表的新書內容:


Q:每一天都用一個檔案,用來記錄當天每支程式內部的執行狀況。
以下是相關的規範:

1. 檔案統一放在 C:\MIS2000Lab_ASP.NET_Log目錄底下。
2. 每一天都用一個單獨的子目錄,子目錄名稱就是當天日期。
3. 檔名必須是以當天日期為名,副檔名是.log,例如:20081231.log。
4. 檔案內每一段訊息,都要記錄完整的日期與時間(年/月/日/時/分/秒)。
每段訊息各自獨立一行,格式如下:
[2008/04/01 14:00:33] Message: 錯誤訊息XXXYYY
5. 檔案內的文字,採用 Big5正體中文來編碼。


記錄檔案的後置程式碼如下,其實不難,大部分都學過了。程式碼請看這裡----http://www.dotblogs.com.tw/mis2000lab/archive/2008/05/19/4034.aspx

推薦好書----深入淺出C# (歐萊禮,O'Relly)。很適合初學者與新鮮人~

推薦好書----深入淺出C# (歐萊禮,O'Relly)。很適合初學者與新鮮人~


市面上有些電腦書寫的很不錯。
英文原文書當然沒話講,或許是語言的關係,他們寫技術文件比較單刀直入,一目了然。

後來我發現國內的出版社,也引進一些「日文翻譯書」。日本人也是好樣的!
他們不說廢話,書裡面都是很實用的範例。也讓我印象很深刻。
例如:入門SQL(博碩)、ASP.NET語法範例字典 / SQL語法範例字典(旗標)。這幾本日文翻譯書都超讚!
很務實,學到的東西都很實用!

以前有一陣子,英文書有一系列的 XXX for Dummy (http://www.amazon.com/ASP-NET-Dummies-Bill-Hatfield/dp/0764508660)。
國內也出版過翻譯本,這些書籍都很淺顯,初學者很能接受。
有一家出版社,名為PC User,他們出版的書也是走向這類型,淺顯易懂。

昨天去逛書店,看見「深入淺出C# (歐萊禮,O'Relly)」http://www.oreilly.com.tw/product2_others.php?id=a230
這一系列的書(名為 Head First XXX),也是很淺顯。
最特別的是:這系列的書本,裡面圖片比文字還多!排版方式也很[動感]!
缺點就是「貴!」,中譯本比一般國產電腦書還貴兩百元左右。

但內容很有趣,就如同書裡講的「很適合程式設計的新鮮人、初學者」。
隨手翻翻,就看完一大半。但是.....這種搞笑的語句、大量圖片與插畫.....國內出版社的編輯人員 [似乎] 不太能接受
也可能書市慘澹,目前出版社主打學校教科書市場。教科書嘛!不能太輕鬆啦~要嚴肅一點點。

這一系列的書,(歐萊禮,O'Relly)將他中文化,出版好多本。PMP、SQL等等,內容包羅萬象。
都是鎖定「初學者」市場的。.............我看完之後,發覺--
除非我請漫畫家來合作,推出一本「看漫畫學ASP.NET」,不然的話很難贏過它了
(這不是開玩笑,日本有很多這種書籍,例如:看漫畫學XXX,都是電腦書喔!)

但是,不要小看這一本入門書喔!
該講都講了。包含:物件導向、型別&參考、封裝、繼承、介面與抽象類別、列舉&群集等等。
內容豐富得很~

很多初學者,買書就看「書店的排行榜」、「看人家推薦什麼」、「買最厚的一本」.....
說穿了,是買心安的。就跟初一十五去廟裡拜拜一樣(我當年也是如此)
慢慢的,我才發展出一套方法論,能夠「挑選適合自己程度的書」。
適合自己的書,未必適合別人。未必是暢銷書。
只要對自己有益!就是一本適合自己的好書!(意思雷同於:管他黑貓白貓,會抓老鼠就是好貓!)

.........................................................................................................................
(謎之聲:咦?你玩ASP.NET一段時間了,自己也出書,怎麼還買這樣的入門書來看呢?)
就如同我說過的(請看下面,我以前的PO文)----溫故知新。書本永遠看不完。
一本書,只要有一個範例、一章,讓我有感覺。那麼這五六百元的書錢,就沒有浪費!
~~~~寫程式所需要的參考書,沒有「一本就能搞定」的聖經!~~~~多多益善,開卷有益。

看見了一本有趣的好書,也跟大家分享一下 (^_^)
.........................................................................................................................
相關文章----如何挑一本好書,學習ASP.NET。個人觀點,非戰文。

[Info]Enterprise Library 4.0發佈了

今天一早就看見 LOLOTA前輩的文章----[Info]Enterprise Library 4.0發佈了
這東西是什麼啊?
也就是以前講的DAAB(全名Data Access Application Block ),
現在改名為 Patterns & Practices(或是稱為p&p),一般都稱為 Enterprise Library (EntLib)
以前在MSDN論壇也有討論過,請看這篇文章-- http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=2703042&SiteID=14

微軟MSDN裡面,有一個專區---- http://msdn.microsoft.com/zh-tw/practices/default(en-us).aspx

下載與說明:http://www.codeplex.com/entlib
沒記錯的話,他們是開放原始碼的,有興趣的人可以參考或是改寫。
安裝完成,就會在目錄底下看見一個原始碼(SourceCode)的目錄

如果您接手以前的程式,發現裡面常常有一個 SqlHelper()之類的東西。
沒錯,SqlHelper就是前身,您可以參考這篇中文文件(年代有點久):Microsoft Application Blocks for .NET

我們可以從這些地方,更瞭解 Enterprise Library(p&p)。
Get Started With p&p
What is p&p?
Who We Are and What We Do
Explore the p&p Catalog

小弟在 3.1版的時候,稍稍玩過(試了一下)Enterprise Library ,那時是搭配 .NET 2.0與VS 2005的。那時共有八大分類,「資料存取」僅僅是其中一類。
寫了一些ADO.NET的程式(DataReader與DataSet),跟Enterprise Library提供的比較一下
相同程式跑一萬次,來記錄執行時間。似乎手工自己寫ADO.NET比較快,平均時間都快了一秒。

有兩個範例要跟大家分享,因為這個BLOG張貼程式很醜,請您看這裡----http://www.dotblogs.com.tw/mis2000lab/archive/2008/05/21/4091.aspx

2008年5月19日 星期一

JavaScript + ASP.NET

JavaScript + ASP.NET

1. 以動態方式將用戶端指令碼(JavaScript)加入至 ASP.NET Web 網頁
以下都是 Page.ClientScriptManager 類別
資料來源:微軟 MSDN 官方網站 http://msdn2.microsoft.com/zh-tw/library/ms178207(VS.80).aspx
方 法
說 明
RegisterClientScriptBlock
將指令碼區塊加入頁面頂端。您可以字串形式建立指令碼,然後將它傳遞給加入網頁的方法。您可以使用這個方法將任何指令碼插入網頁。請注意,在完成所有項目之前指令碼可能就會呈現至網頁。因此您可能無法從指令碼參考網頁上所有的項目。
RegisterClientScriptInclude
這個方法類似 RegisterClientScriptBlock 方法,但是會加入參考外部 .js 檔的指令碼區塊。在以動態方式加入任何其他指令碼之前就會加入這個包含檔。因此您可能無法參考網頁上的某些項目。
RegisterStartupScript
將指令碼區塊加入當網頁完成載入(註:把JavaScript放在ASP.NET網頁最下方),但是在引發網頁的 onload( )事件之前,就會執行的網頁。這個指令碼通常不會建立為事件處理常式或函式。其通常只包含想要執行一次的陳述式。
RegisterOnSubmitStatement
加入執行以回應網頁 onsubmit 事件的指令碼。在送出網頁之前就會執行指令碼,並且讓您有機會取消送出動作。

 
2. 將用戶端指令碼事件 加入至 ASP.NET Web 伺服器控制項
以下的範例,是用來區分兩種不同的Click方式。一種是Server端(下面綠色字體),另一種是Client端(下面紅色字體,以JavaScript的方式。)
資料來源:微軟官方MSDN網站 / http://msdn2.microsoft.com/zh-tw/library/7ytf5t7k(VS.80).aspx

<%@ Page Language="VB" %>

<html>


<script
runat="server">

    Sub Button1_Click(ByVal sender As Object,
ByVal e As System.EventArgs)

        Label1.Text = "Server click handler
called."

    End Sub

</script>


<body>

  <form id="form1" runat="server">

    <asp:Button ID="Button1" Runat="server" 
OnClick="Button1_Click"


          OnClientClick="return
confirm('Ready to submit.')
"



          Text="Test Client Click" />

    <br />


    <asp:Label ID="Label1"
Runat="server" text="" />

  </form>

</body>

</html>


FileUpload控制項「批次上傳 / 多檔案同時上傳」的範例

FileUpload控制項「批次上傳 / 多檔案同時上傳」的範例

以下是即將發表的新書內容:
FileUpload控制項真的簡單好用,不使用它來作批次上傳,卻要改用別的方法,實在不聰明。要用就一次用到底,
公開FileUpload控制項「批次上傳」的範例,千萬不能錯過。

首先,進行HTML畫面的設計,根據上圖,在畫面上使用多個 FileUpload控制項,然後搭配一個按鈕控制項即可。
除此以外,範例 8_Multi_Upload.aspx還加入了「避免上傳同名檔案」的功能(本範例共有三種子功能,其中沿用本章之前介紹的兩個範例),可以說是把本章的各種範例作一個大融合。以下是後置程式碼:

以下是即將發表的新書內容:

01
02
03 Protected Sub Button1_Click() Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
04 '--註解:網站上的目錄路徑。所以不寫磁碟名稱(不寫 “實體”路徑)。
05 Dim saveDir As String = "\[Book]FileUpload\Uploads\"
06 Dim appPath As String = Request.PhysicalApplicationPath
07 Dim tempfileName As String = Nothing
08 Dim myLabel As New System.Text.StringBuilder
09
10 For i = 1 To (Request.Files.Count - 1)
11
12 Dim myFL As New FileUpload
13 myFL = CType(Page.FindControl("FileUpload" & i), FileUpload)
14
15 If (myFL.HasFile) Then
16 Dim fileName As String = myFL.FileName
17 Dim pathToCheck As String = appPath & saveDir & fileName
18 '====用來處理上傳檔案的「檔名重複」問題 =================(Start)
19 If (System.IO.File.Exists(pathToCheck)) Then
20 Dim my_counter As Integer = 2
21 While (System.IO.File.Exists(pathToCheck))
22 ' --檔名相同的話,目前上傳的檔名(改成 tempfileName),前面會用數字來代替。
23 tempfileName = my_counter.ToString() & "_" & fileName
24 pathToCheck = appPath & saveDir & tempfileName
25 my_counter = my_counter + 1
26 End While
27 fileName = tempfileName
28 Label1.Text = "抱歉,您上傳的檔名發生衝突,修改如下" & "
" & fileName
29 End If
30
31 Dim savePath As String = appPath & saveDir & fileName
32 myFL.SaveAs(savePath) ' –存檔。完成檔案上傳的動作。
33 '==============================================(End)
34 myLabel.Append("
檔名---- " & fileName)
35 End If
36 Next
37
38 Label1.Text = "上傳成功
" & myLabel.ToString
39 End Sub


補充----
網路上找到的相關文章:让UpdatePanel支持上传文件 http://www.cnblogs.com/JeffreyZhao/archive/2008/05/04/build-component-to-upload-file-in-updatepanel.html

四川大地震,願大家都平安,Peace!

四川大地震,願大家都平安,Peace!

網路上吵得很厲害,要「人道」、要「以直報怨」、要XXXY等等.....都不如下面這位朋友的一句話:

迴響來自: Sampkao [訪問者]今日的種種敵意,都是過去五十、一百年來的積累;
未來的五十、一百年會如何,就要看我們今日怎麼去做。全文連結 2008-05-14 @ 19:53
提供三篇好文章,讓自己反思。

多台Web Server(IIS)作 Load Balance,session怎麼處理?

多台Web Server(IIS)作 Load Balance,session怎麼處理?

原文是 MSDN論壇的一篇文章,大家有興趣可以去看看。http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3346245&SiteID=14&mode=1


以下是我的回答:
這期的MSDN雜誌有提到喔,以下只是那篇文章的摘錄(原文很長。是中文的,放心去看吧)
http://msdn.microsoft.com/zh-tw/magazine/cc500561.aspx
如果您有一部以上的 Web 伺服器,那麼應該要把工作階段(Session)作業資訊儲存在哪裡?
可用的一個方法,是將資訊儲存在 Web 伺服器上,然後使用相似性。基本上,這代表來自某一位使用者的第一個要求會進行負載平衡,之後,所有來自該使用者/工作階段的要求,就都會傳送到與第一個要求相同的伺服器上。這是一項簡單的方法,每一種負載平衡解決方案都支援這樣的做法,而且在某些案例中是很合理的做法。
然而,長期而言,相似性會造成慘痛的問題。保持工作階段資料在同處理序 (In-Process) 或許是較快的方法,但是如果 ASP.NET 背景工作處理序進行回收,則這些工作階段就會中斷。背景工作處理序會進行回收的原因有很多。在高負載的情況下,IIS 可能會回收 ASP.NET 的背景工作處理序,因為它可能會認為該背景工作處理序已經卡住。事實上,根據預設,IIS 6.0 每 23 個小時就會回收一次背景工作處理序。您可以調整這個值,但是無論如何,您的使用者還是可能面臨工作階段資料在處理中遺失的風險。當網站的規模較小時,這並不會造成太大的問題,但隨著網站規模的擴充以及流量的增加,這將會成為嚴重的問題。此外還會有其他的問題。

如果您是透過 IP 位址進行負載平衡,其中有一部伺服器將會因為大量的 Megaproxy (像 AOL) 而無法負荷服務的負載。再則,若要在伺服器上更新您的應用程式版本,將會變得更困難;您必須等候使用者完成網站上的作業,或強制中斷使用者的工作階段 (而惹毛這些使用者)。如此一來,網站的可靠性就會遭受質疑:伺服器服務的中斷,會導致許多工作階段的中斷。

消除相似性是分散化策略的關鍵目標。這需要使工作階段狀態資料跨處理序,亦即要為了提升擴充性而犧牲一些效能。當您使工作階段跨處理序時,工作階段資料(Session)就會記錄在所有 Web 伺服器均可存取的位置,這可以是在 SQL Server® 上(請看「瓶水相逢」網友給的建議:HOW TO:設定 SQL Server 以儲存 ASP.NET 工作階段狀態)或是在 ASP.NET 狀態伺服器上。這可以在 web.config 中設定。

若要支援跨處理序工作階段,還需要撰寫一些程式碼。任何將儲存在 Session 物件中的類別,都需要以 Serializable 屬性標記。這表示類別中的所有資料都必須為可序列化,或標記為 NonSerialized,才能被忽略。如果您沒有如此標記類別,當序列化程式執行而要將您的工作階段資料儲存為跨處理序時,就會發生錯誤。

最後,移動工作階段成為跨處理序的方法,可以讓您知道工作階段物件中是否有太多資料,因為如此一來,您就可以察覺到每一個網頁要求在網路上來回傳送大量資料的負荷 (一次在網頁開端做為擷取,一次在網頁尾端做為傳回)。


或是看看下面這篇文章,孫三才老師講的JSP Web Farm,也有很高的參考價值。
http://www.javaworld.com.tw/jute/post/view?bid=30&id=62079&sty=1&tpg=3&age=0

AJAX與ListView的怪現象? --樣版內,控制項ID重複的問題

AJAX與ListView的怪現象? --樣版內,控制項ID重複的問題

這個問題也是我在MSDN論壇回答過的。http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3125960&SiteID=14

Q :ListView裡面的各種樣版,以 ItemTemplate 與 AlternatingItemTemplate這兩個樣版最類似。
如果加上AJAX功能,在這兩個樣版內部,各自加上 UpdatePanel。
很奇怪的是----執行時,會出現錯誤訊息。說 [控制項ID重複?]
取消AJAX的UpdatePanel之後,又好了?真的很奇怪!

重新看了 ListView與SqlDataSource,自動幫我產生的樣版內容(HTML碼)。
沒錯。,這兩個樣版的內容一模一樣啊
不光如此,ListView的各種樣版,裡面各種的 TextBox,ID都是一樣的。
為何不會有錯?但加上AJAX的UpdatePanel就會出錯呢?
...................................................................................................................................

A : 這問題很有趣,所以我也自己測試了一下。
手動去修改 ListView裡面,每個樣版內的 [控制項ID],不要重複就好了。我試過,可以正常執行
我個人的認知如下,未必正確。
傳統POSTBACK的作法,一次只會啟動一個樣版,
所以 ListView各種樣版底下的控制項ID,就算重複也無所謂。
但改成AJAX之後,這時候,每一個控制項ID都必須獨一無二,
不然的話,要怎麼知道是哪一個控制項啟動了非同步的POSTBACK?
我覺得這說法,好像說得通


以上問答,是我在MSDN回答過的問題。http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3125960&SiteID=14
今天又看見它上了最常查詢問題的排行榜。
所以收錄回自己的BLOG裡面