Mexx's profile我們走吧 我們回去PhotosBlogListsMore Tools Help
AmazingCounters.com
新增到您的Live.com

BloggerAds

Loading...

線上收音機

Loading...
Photo 1 of 312

Mexx Hsu

Occupation
Location
Interests
熱衷軟體開發、電腦遊戲、3D動畫
最愛的遊戲:DOS版仙劍奇俠傳、天堂二、N64大亂鬥、三國無雙
最愛的美食:水餃、牛肉麵、虱目魚、鰻魚、滷味、牛奶、麵包、蛋糕、蛋塔、布丁、蚵仔煎、土魠魚羹
最新賞的歌手:張紹涵、周杰倫、梁靜如、S.H.E、伍佰
我的座右銘:不為學習而學習。
送給自己:嚴以律己、寬以待人
No list items have been added yet.

新兵金太郎報到!

 
謝謝您的瀏覽!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
Mexx Hsuwrote:
怪了!我發覺我常常漏看回應,好像 live space 在顯示留言一覽時會有問題?
Aug. 10
Oct. 10
Mexx Hsuwrote:
咳咳... 之前舊版 Live Space 沒有提供留言版功能,所以自己模擬了一個,現在官方提供了,拿來試用一下 !!
May 20
October 21

開發Web專案與開發Web平台的差別

一個很大的差別,我想是順序!
Web 專案,通常是美編設計師切好版面,再給工程師套程式、套控制項。
Web 平台,必須相反,先由工程師開發好所有可能的彈性與擴充,功能齊備之後,再和美編商討如何對版面客製化,討論客製化的過程,就會漸漸發現,其實你已經把自己當作使用平台的客戶了。

Web 專案開發的利潤收得很快,開發時程相對較短,但如果要專案之間互套程式,套到最後通常變成四不像,程式品質不佳。
Web 平台的初期開發時間相當長,也無利潤可言,但之後開始販賣時會輕鬆很多,錢收得更快,而且也比較不會因為持續改版導致程式亂七八糟。

這剛好回答了之前自己的問題:有沒有可能工程師先寫好程式,再交給美編設計套版?那就是 Web 平台的模式。
October 05

Validation of User Controls in ASP.Net

常用的控制項組合,我們會想把它包在一起,日後方便重複使用。
寫 Custom Control 太麻煩了,通常會用 User Control 快速達到我們的需要。
所以就會衍生出這個問題:如何驗證 User Control 的值?例如 User Control 裡頭的某個 TextBox?



首先談兩個觀念
第一是:User Control 包了若干個 Server Control ( or Html ) 之後,外界對它是一無所知的只知道它是個 "UserControl" 類別˙。你必須為它設計一些「屬性」,把該 User Control 的特性給釋出來讓外界知道(讓 aspx 知道)。例如該 User Control 內含一個 TextBox,你若要在 aspx 可以存取該 TextBox 的值,可以設計一個屬性如下:

public string Text
{
    get { return this.TextBox1.Text; }
    set { this.TextBox1.Text = value; }
}

相關的介面:ITextControl、IEditableTextControl,只要繼承了他們,就一定要有 Text 屬性。

第二個觀念是:"UserControl" 類別繼承了 INamingContainer,所以上面 TextBox1 Render 到前端後,不會仍然是 id="TextBox1"


以下還有一些常見問題:
  • Q:如何在「屬性視窗」可以看到該屬性?
    R( Reference ):查詢 "Browsable"
    PS:就算屬性視窗看不到,還是可以直接用 Tag  的方式指定屬性值,也可以在 vb/cs 檔案中指定。
    .
  • Q:如何讓屬性支援資料繫結 ( DataBinding )?
    R:查詢 "Bindable"
    PS:Visual Studio 開出來的 databinding dialog 中,仍然看不到該屬性,這是 VS 的 Bug,但仍然可以直接以 Tag 的方式設定 databinding。例如:Text='<%# Bind("StartDate", "{0:yyyy/MM/dd}") %>'
    .
  • Q:我在 User Control 裡面塞了好幾個驗證控制項,這些驗證控制項我只在乎它們會不會做輸入驗證,在設計階段希望可以隱藏,才不會拉一個 User Control 出來,就佔了 aspx 版面一大塊。
    R:試試看 PlaceHolder
    .




接下來,就進入比較主題的部分,就是如何驗證 User Control 的屬性值?有兩個做法:
  1. 在 User Control 裡面就先佈置好驗證控制項,這個比較簡單,通常適合放一些必要的驗證而已,不要阿貓阿狗什麼都拉進來,把它搞大了不是好事。例如你要做純日期輸入的 TextBox,你也許就會塞個 RangeValidator,或是利用 AjaxControlToolkit 的驗證控制項
  2. 當 User Control 拉到 aspx 頁面上之後,你要用 aspx 頁面上的驗證控制項來驗證 User Control 的值。那麼,請參考 "ValidationProperty" ...... 真的有這麼簡單嗎?
實際上還是會遇到許多問題。(有文章說還需要 "ControlValueProperty" 屬性,其實不需要,這是兩回事)







以下用 RequiredFieldValidator 舉例:
  • Q:驗證是沒有問題,但變成一定要 PostBack 之後才能得到驗證結果
    R:驗證控制項會偷偷產生一些 JavaScript 幫我們做 Client 端驗證,你若檢視原始檔,會發現有一堆驗證的 script,有沒有看到 xxxxxValidator.controltovalidate = "某某控制項ClientID" ?這就是了!它需要「正確」的 ClientID 來協助驗證。可是你會發現,這個 "
    某某控制項 ClientID" 是該 User Control 的 ClientID,而不是它裡面那個 TextBox 的 ClientID,當然就無法做 Client 端驗證了。
    A:宣告一個隱藏欄位(Hidden Field),來代表該 User Control 的值,欺騙 RequiredFieldValidator 做 Client 驗證。
    1. 在 User Control 的 Page Load 加入 Page.ClientScript.RegisterHiddenField(this.ClientID, this.Text);
    2. 設定內部 TextBox 的 onchange 事件,同時改變 Hidden Field 的值。this.dateTextBox.Attributes["onchange"] = ..........
      .
  • Q:某天你把它放到資料繫結控制項(GridView、FormView .....)的 "Template" 裡面....又發現一堆問題!你對該 User Control 的 Text 屬性設定資料繫結,進入 FormView 的編輯模式時,TextBox 明明是有值的,外面那個 RequiredFieldValidator 卻當作沒看見,submit 動作一直被它檔下來。
    R:在 User Control 的 Page Load 事件裡面,它根本還沒做資料繫結,所以 Text 值是空字串,你馬上註冊 Hidden Field,所以它的值也是空字串 ........ RequiredFieldValidator 果然不馬虎,很盡忠職守。所以註冊 Hidden Field,應該要等到確定 Bind 完資料之後,建議改到 OnPreRender 事件。

做到這邊
其實可接受了,若你已經滿意,底下的就可以忽略不看。







  • Q:但仔細比對原本 RequiredFieldValidator 的行為,你發現有些微差異:本來是 TextBox 失去焦點,或改變值就會驗證,現在卻變成要按 Button 才驗證?
    • R:可以多試試看,會發現 RequiredFieldValidator 放在 User Control 裡面,就一切正常,放在 aspx 就會有這個問題,但我前面說了,你總不能把所有驗證控制項都塞進 User Control,這太不像話了 .....
      .
    • R:拉一個頁面,用 RequiredFieldValidator 驗證一般 TextBox,然後利用 JavaScript 偵錯工具(例如Firebug、IE8內附、Visual Studio ...)查看到底 TextBox 的 onchange 事件發生後,偷偷做了什麼事情,否則為何 RequiredFieldValidator 會立刻知道?結果發現它呼叫了 ValidatorOnChange(event)?一看就知道是驗證控制項搞的鬼,我們就有樣學樣,在原本 this.dateTextBox.Attributes["onchange"] 事件中再加上 "ValidatorOnChange(event)"
      .
    • R:噩夢竟然還沒結束?RequiredFieldValidator依然沒有在 TextBox  onchange 時立刻驗證。那麼就試著偷看 ValidatorOnChange 函數到底做了什麼?想辦法在執行它之前先中斷 JavaScript(提示:debugger),然後利用單步執行一一深入。你會發現一些 JavaScript 試著取得驗證該 TextBox 的所有控制項」,是一個陣列,可是竟然只得到 User Control 內部的驗證控制項,在 aspx 上面的驗證控制項它都當作沒看見 ...... 其實這是理所當然的,因為放在 User Control 外面的 RequiredFieldValidator,它在 Client 端真正驗證的對象是我們給的隱藏欄位,而不是 User Control 裡面的 TextBox。
      .
    • R:直覺的解決方式,能否把外面的 RequiredFieldValidator ,也加到該陣列裡面?那就再找看看,到底是什麼時候把驗證控制項加入該陣列?又呼叫了什麼函數?
      .
    • R:經過追查,得知 ValidatorHookupControl 這個函數,它可以接受兩個參數:第一個是「真正被驗證的控制項的 Client 物件」,第二個是「驗證控制項的 Client 物件」,舉個例也許較容易懂:
      ValidatorHookupControl(document.getElementById('textbox1ClientId'),
      document.getElementById('validatorClientId')); 把該指令也加到 TextBox 的 onchange 事件中。這樣就可以把該驗證控制項加入到陣列裡面
      .
    • 做完以上動作後,驗證控制項就會完全恢復往日雄風了!







嚴格來說,還是有點美中不足的:
  • Q:你知道 aspx 中有哪些驗證控制項針對該 User Control 做驗證,但是該 User Control 怎麼主動得知:「有誰對我做驗證?」難不成我們每次都要手動自己 key 嗎?
    R:愈扯愈遠了................ 建議寫一個函數,或是擴充方法(例如 Control.GetValidators())來做上面這件事。



豐收

那個換來的冰淇淋月餅,我以為可以一直送,哪知道送一個就沒了 =。=



October 03

Happy Farm 的改變

感覺得出來,作者很用心在經營、擴充
畫面是變得漂亮了,「精緻」了,但我覺得畫面不必改這樣
還是比較喜歡它之前的輕鬆、隨意的風格
讓人很有親切感~


September 13

HtmlInputFile、HttpPostedFile、FileUpload

在 ASP.Net 1.x 的時候,我們用 HTML File Field(HtmlInputFile) 手動設 runat="server" 做檔案上傳,要直接操作 HttpPostedFile。

到了 ASP.Net 2.0,新增了 FileUpload 伺服器控制項,包裝了一點點程式碼,我們不用再直接操作 HttpPostedFile,程式稍微簡潔了些。但是其內部還是在操作 HttpPostedFile。真正有價值的差異是 FileUpload 控制項的 FileBytes 屬性。

FileBytes 回傳的是 byte 陣列,等於是幫我們做了序列化,讓檔案上傳機制有了更多可能性,可以更方便的將檔案內容直接轉存到資料庫,或是將檔案傳遞給遠方 WebService 接收 .....

還有 FileBytes 屬性被標記為 Bindable(true),更可以將 FileUpload 控制項輕鬆搭配資料繫結控制項(例如 FormView)、DataSource 控制項(例如 ObjectDataSource),作資料繫結,當然省了相當多程式碼。

ASP.Net 2.0 之後,建議用 FileUpload。


另外,網路上非常多文章說,HtmlInputFile 與 FileUpload 還有一個差異,就是後者會自動為 form 加上 enctype="multipart/form-data"。可是我印象中以前寫 ASP.Net 1.x 好多時間,從來沒手動幫 form 加這個屬性,HtmlInputFile 也都用得好好的。最近又用 VS2003 測試一下,發現 HtmlInputFile 只要設 runat="server",同樣會自動補上 enctype。不知是不是曾經有這問題,後來被修補了?

如果不設 runat="server",的確就不會加 enctype。(但是這樣一來,它還能幹嘛?)

September 11

ASP.Net 2.0 Profile 宣告陣列欄位

<add name="NewColumn" type="System.Array" />  這樣宣告是無效的!

因為 System.Array 是所有陣列的基底類別,只有系統或編譯器能明確繼承這個類別
你宣告的任何陣列都會被「偷偷的」繼承它,只是你看不到,所以忘了「System.Array 可以代表所有型別陣列」這件事

當你宣告 profile item 的型別是 System.Array,它根本不知道陣列元素的型別是什麼?(陣列初始化時,一定要知道型別)

你可以試試 System.Array 能不能用 new 的語法直接初始化為特定型別,答案是不行的!

至於 ArrayList 則不是陣列,而是集合,它的每個成員都是 object 類別,相當明確
(雖然 object 也可以代表所有東西,但 profile 機制至少知道它是 object 類別,至於到底儲存什麼東西?那是序列化的問題)
因此這樣宣告沒問題:
<add name="NewColumn" type="System.Collections.ArrayList" />

而宣告陣列的正確語法則是:
<add name="NewColumn" type="System.Int32[]" />
<add name="NewColumn" type="System.String[]" />
以此類推

ASP.Net 2.0 授權實作

目標:使用者驗證通過之後,對頁面或目錄的存取授權
應用:登入後端的使用者,不見得可以管理所有的系統,這很常見;建立使用者的時候,要順便勾選該使用者可以存取的系統 .....諸如此類

假設你有一個資料表儲存後端系統架構和路徑,那麼最簡單的做法,當然就是 ASP.Net 2.0 的 Profile 機制:利用 Profile 替使用者加個欄位,儲存該使用者授權存取的系統代碼,之後就可以在頁面中拿來當作授權之用。可參考聖殿祭司的「ASP.Net 2.0 專家技術手冊」

另一個怪怪的做法,是利用標準的授權機制,也就是 web.config 的 authorization 項目,ASP.Net 的網站管理工具其實也是透過它來做授權 ....... 但我個人覺得,重看不重用:P
  1. 如果網站使用者多、角色多、或後端系統很多,那麼 web.config 可能會寫得密密麻麻
  2. 個人不太喜歡一個網站在各個資料夾底下都有個 web.config。
  3. 一般情況下只能對目錄授權,而不能針對個別頁面授權,一定要作頁面授權的話,作法又很囉哩叭縮 ...

所以如果是小網站,他真的是滿方便的! 作法就是
  1. 先取得所有需要授權的系統路徑
  2. 然後用 WebConfigurationManager 取得各個目錄的 web.config
  3. 再用 authorization 的 API,也就是 AuthorizationSection、AuthorizationRule 這些類別來加上一個 <deny users="*" /> 的項目。這樣該目錄就任何使用者都不能存取
  4. 之後建立使用者時,利用同樣的方法存取 web.config,為特定的路徑加上 <allow users="某某某" /> 放在 deny 的前面,這樣就達到授權目的 ............
  5. 真的囉嗦。



August 21

工程師的樂觀與悲觀

我抱怨:剛出社會的時候,寫程式常常被催,公司又想凹你;三十幾歲寫專案,功力更強了,還是常常被催,公司凹更大;四十幾歲當上主管了,變成老闆或客戶在催你,台灣的軟體工程師怎麼都這麼苦命?

我朋友笑得開懷:剛出社會上班吹冷氣;三十幾歲上班吹冷氣;四十幾歲還是在辦公室吹冷氣泡咖啡,多好!

她的回答讓我笑了!哈哈!真有意思!
August 19

快速架站機,我的疑惑,想請教

市面上形形色色的快速架站軟體,或說網站內容管理系統(Content Management System)
例如,XOOPS、DotNetNuke、Joomla、Discuz、Drupal、SharePoint、WordPress、osCommerce、phpShop、PHP-Nuke .....
為什麼還是有公司以 CMS 為主要產品線呢?
我不太懂這一塊有多大商機,有人願意指點我一下嗎?

August 16

Windows Mobile 6.5 手機程式開發 - Widgets

安裝與開發教學,網路上就一堆文章可查了,這邊就不再囉唆。
  • 本質:html + css + JavaScript
    把這些東西放在 Internet Explorer Mobile 6 上面運行,說穿了,只是個小網頁而已@@,對網頁設計師來說,不會完全陌生。
    .
  • 能做什麼:AJAX
    既然能跑 JavaScript,正當火紅的 AJAX 也不應該缺席。可以收集網路上各式各樣的 Web Service、或使用額外的 API 來豐富你的 AJAX 應用,例如 Google Map API。
    .
  • 不能做什麼:
    無法存取裝置內的個人資料,包含聯絡人、電子郵件、Registry 與檔案系統。
    .
  • 其他支援:Flash、ActiveX?
    Flash 我在模擬器上測試可以,這可爽到視覺設計師了!ActiveX 我沒試過,也沒找到範例,有的網站說可以,也有文件上說不支援,最好不要做,MarketPlace 可能會擋。
    .
  • 未來的期望:ASP.Net、Silverlight
    既然有 Flash,那麼一定會支援自家的 Silverlight,早晚而已,否則就變笑話了。要支援 ASP.Net,似乎就比較遙遠,而且是否有需要?
August 13

愛打乒乓的人有這傾向

發現有人身穿「看似」選手運動服,例如黑色短褲 + 條紋運動衫,會有兩種心態
  1. 直覺這傢伙很強,所以才敢這樣穿,不敢和他打
  2. 直覺這傢伙很強,所以才敢這樣穿,想上前挑戰

我。。。只不過是天氣太熱太悶,想穿涼爽一點打球 ==
August 10

原來回家也不容易

到了禮拜日中午,風雨明顯弱了很多,趁著這時候趕回去幫忙,沒想太多
結果本來要經過阿蓮,遠遠看到每輛車子都過去又折返,原來過去就是汪洋一片,上面還橫著一輛休旅車@@
所以我就改向台南市這個方向,稍遠一點,但也是我熟悉的路

一路上常遇到爛泥濘,偶爾又來個大雨,心裡在想:不好!該不會等下又被水阻了?!
果然快到台南時,眼前又是一片湖海,又得改道了

還好這時候已經在台南縣,比較好摸索,我改騎向仁德
靠著路標糊裡糊塗摸索著回家的路

到永康時,又是一片@@
但我看有人敢涉過去,有的人不敢,處在很間介的範圍,其中還有一輛機車!
喔~既然有人先騎給我看,說不定我也過得去
不然那邊路我不熟,改道的話又不知要繞道哪邊去
所以這次就勇敢的衝囉!哈!真是委屈我的小白了


August 07

Mom

I want to go back to Tainan ..... Should I? You said you would take a break next year ... yes, you should do it! I hope I can help you mop the rooms, help you take out the garbage, help you wash the dishes, help you wash the clothes everyday. I can teach you what is "e-mail" again. I can teach you how to play photoshop. You said you work of a laborer from this month. Should I still stay here?
I have direction, no answer ? but I just need a correct answer rightnow....



太超過的重男輕女

老人家重男輕女,難免啦
因此分家產的時候,刻意不分給女兒?喔 ... 摸摸鼻子吧 .....
 
但是都已經不分家產給女兒了,生活起居卻還要刻意幫省兒子的錢,只花女兒的錢,還疑心女兒污他的生活費
就算覺得女兒沒用,差別待遇也不需要這麼誇張吧。