Pages

2009-10-31

AJAX Toolkit的TabContainer顯示問題

發現微軟所出的AJAX Control Toolkit之TabContainer控件有顯示上的問題 (實驗版本: 30930, 2009/10/06)

該頁宣告為XHTML 1.0版本,則Tag顯示上並無問題:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
SNAGHTML1ba2ea6

若該頁宣告為HTML 4.01版本,則Tag顯示上會被遮去一半:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
SNAGHTML1b8f84b

實驗其他AJAX Toolkit舊版本也如此,調了CSS或把Tab Header顯示強制BR或DIV顯示也仍會被遮一半
使用XHTML 1.0格式雖能正常顯示,但往往Web Page的視覺設計可能是以HTML 4.01傳統方式
要為了這個tab而全頁調整,就非常痛苦了。

否則只能換其他tab頁籤顯示效果或3-Party元件才行(如Telerik TabStrip)。

2009-10-20

預設建構子呼叫其他建構子

在C++類別建構時,無法在建構子之間要互相呼叫彼此
總是得把共用的部分寫在一個Private Method()來呼叫。

C#的類別裏,即可使用下面的語法作預設值呼叫:
SNAGHTML3d1e958

2009-10-18

Email寄送的整合類別 - MailClient

.NET下要寄送Email,肯定最常用的是System.Net.Mail命名空間下的MailMessage + SmtpClient類別。
MailMessage是處理郵件內容,需要處理一大堆User輸入的To/CC/Bcc郵址格式判讀、唯一性、防錯例外,
MailBody內容宜讀取獨立範本html檔,使用Macro巨集變數替代,方便日後郵件內容維護。

SmtpClient的重點在於了解Reply Credential (轉寄授權)的方式,可參考以下文章:
http://www.cnblogs.com/hwade/archive/2007/11/28/976026.html
筆者對Mail伺服器管理稍有經驗,知道SMTP的相關限制(Session數量)及存取方式
因此建立了數個UseXX?Credential(),使用時很清楚SMTP認證的方式。

在附件(Attachment)的處理上,除了寄檔外,也該具有Embedded Images圖片內嵌功能。
在電子報的應用裏,相關的信件Links也要由相對網址變成絕對網址。

很多Email寄送的議題需要考量+經驗,為此我製作了一個MailClient整合性類別,
儘量直通底層的物件屬性而不另建立變數複本(以免同步上有問題),
以下的語法範例可勾勒出一種簡易卻延伸性廣的Design Pattern。

SNAGHTML118d110c

2009-10-16

容易引起例外的MailAddressCollection.Add()參數

在ASP.NET 3.5中,要寄發Email,就是用System.Net.Mail.MailMessage物件來構成Email主體
在處理收件人中,MailMessage.To.Add()的參數可以是一個MailAddress物件,
也可以是一個以逗號隔開的Email List String.

這一個多人地址的分隔字串,在.NET舊版本有以分號(;)隔開,也有以逗號(,)
也可以使用: MailMessage.To.Add(“DisplayName <user@test.com>");

當郵址分割字元不合規定時,寄信時會出現Error: Recipient unknown例外
Mail Address字串格式不對或有空白,也會引起例外,
有很大理由要用一個處理函數來一致化user輸入的多人郵址字串。

我寫了一個這樣萬用的函式,且相同位址不會重複加入(注意\r\n\t等字元):
int count = AddMailAddresses(msg.To, "User1 <user1@test.com>, xxx; user2@test.com, ”);  // count=2
int count = AddMailAddresses(msg.To, "User1 <user1@test.com>, xxx; user2@test.com, ", ",;|".ToArray());  // count=2

2009-10-15

自訂Directory目錄處理類別

.NET 提供System.IO.Directory類別來處理與目錄相關的函式,只是在實務裏缺了一些便利的處理函數
其實這些特殊函數實作並不難,但如何設計精鍊且高效能,端視程序員的經驗能力。
SNAGHTML6cd1a66

以下列出筆者自訂Directory類別的功能:
1. Copy: 複製目錄,當然具有Recursive功能。
2. Delete: 刪除整個目錄,避開其下ReadOnly屬性的檔案及任何例外,Recursive。
3. DeleteByWmi: 刪除整個目錄,使用System.Management的WMI方式刪目錄,可迴避唯讀錯誤。
4. GetDiskSize: 計算整個目錄的Size (in Bytes)
5. IsEmpty: 檢查該目錄下是否為空目錄?
6. IsValidPath: 檢查該目錄的full path是否字元與格式都合法?
7. SetAttributes: 設定目錄屬性,支援多種屬性項目修改及Recursive.
8. SuffixSlash: 目錄路徑最後加上斜線,一致化dir路徑格式。

2009-10-12

替代無效的檔名字元

當自動從資料庫項目名稱生成檔名時,我們須判斷是否符合os所規定的檔名字元
以下的函式即可替代掉無效的字元(不包含路徑)。
SNAGHTMLa787d8f

呼叫方式:
string s1, s2;
s1 = "test*.txt?";
s2 = ReplaceInvalidFileNameChars(s1, '_');  // s2 = test_.txt_

2009-10-05

透過Encoding BOM作不同檔案編碼的轉換

檔案文字編碼區分為ASCII及Unicode,而Unicode又區分UTF7,8,16,32等系列,
我們透過BOM (Byte Order Mark)資訊作判讀依據,但BOM不一定存在。
相關的FAQ基本知識可參考: http://www.unicode.org/unicode/faq/utf_bom.html

程式實作中,若遇到一個二進位檔,就是透過BOM資訊來偵測其編碼格式。
SNAGHTML115ef4f3

得知其最有可能(因為BOM不一定存在)編碼格式後,
即可用System.Text.Encoding.Convert(srcEncoding, dstEncoding, byte[])來作轉換。
須注意的是,轉換前要先摘除BOM資訊,轉換回來寫檔前,再先插入BOM資訊
即可完成不同Encoding的轉換。

微軟.NET Framework命名風格裏,似乎把Unicode當作是UTF-16LE,
很容易跟最新的Unicode規格混洧,可能原因是微軟的Unicode是從規格1.0開始發展,
大家使用上能理解對行了。

至於UTF32BE(Big-Endian),.NET Framework中並沒有對應的編碼屬性對應(沒寫的就是LE)
請使用Encoding.GetEncoding(12001)來替代之。

2009-10-04

MD5 Creator

MD5編碼加密在密碼應用裏常常被使用,除了其不可逆的特性,即使再長的原文內容,
也會被編碼成固定長度為32的字串。

由於這種MD5產生程式太簡單了,我一直再造車實作,而使用網路上的MD5服務:
http://www.md5-creator.com/

為了怕網路不通,身邊還是有個離線版為宜。網路卻找不到這樣簡易陽春的軟體
只好實作一個免安裝的MD5 Creator。
SNAGHTMLca846b2

下載: MD5 Creator for .NET 2.0 (11KB)