跳到主要內容

發表文章

目前顯示的是有「程式設計」標籤的文章

在使用ASP.NET validation server controls的頁面中防止 Double Submit

上週五,同事在解一個網頁的問題,就是ASP.Net的頁面上,使用了validation server controls去驗證必填欄位,然後全部驗證成功後,為了要防止使用者因為連線過慢而導致連續按"送出"按鈕,進而產生兩張單的問題,當下有想到的解法就是使用JQuery在使用者按下"送出"的時候,把送出按鈕Disable。程式碼如下: 然而卻發現原來JQuery的$("form").submit是在"送出"按鈕被Click就觸發的,所以根本沒有驗證也一樣會讓Button給Disable,所以必須要確認是validation server controls全部驗證完成後,再執行"送出"按鈕被Disable動作,經過Survey發現你可以用JavaScript去檢查Page.IsValid這個值,不過條件是在Submit的按鈕上的CausesValidation屬性必須要設為True才會有動作,Submit如果設定將CausesValidation屬性設為True則validation server controls全部驗證成功,form才會post到Server上,否則如果有一或多個error,則將會進行以下的動作: 1. Submit取消。form不再post back到Server。 2. 任何無效的驗證將顯示出來。 3. 如果驗證是ShowSummary=true,並將收集所有的Error並且呈現。 4. 如果驗證是ShowMessageBox=true,將收集所有的Error並透過Message Box呈現。 因此透過這個特性,所以只要再加上判斷Page.IsValid是否為True,就可以知道是否所有的驗證控制項都驗證成功。 所以將程式改寫成如下: 就可以既完成驗證,又能夠防止使用者Double Submit。 感謝Yi-Ching提供協助測試,並丟了一個好問題,也感謝金龍一起腦力激盪,消耗不少腦細胞。 ^_^ Reference: 1. http://msdn.microsoft.com/en-us/library/system.web.ui.page.isvalid.aspx 2. http://msdn.mic...

誰是使用者?[IT邦幫忙鐵人賽 Day5]

許多時候面對使用者的需求,總有難以應付的時候,尤其是面對著非資訊相關背景或對資訊一點念都不懂的人,就會有這樣的感嘆,但應該如此就把使用者的需求給忽視掉了嗎?亦或需要滿足每一個需求?這都是需要好好的被思考的一部分。 在前篇文章 【資訊人員該學的專業】 中曾經提到我在某一醫學中心的工作環境,其實在哪邊的日子裡只要不要碰到開會,通常都還是過著不錯的日子的,那段時間也是我程式設計功力成長最快的日子,由於在哪邊就我一個資訊人員,除了開發系統外,還要處理統計資料的匯出、統計資料的整理與分析、電腦故障的排除、甚至連接投影機都是資訊人員的工作,所以瑣事還算不少,因此寫程式僅佔所有工作時間的60%而已,加上前人所撰寫的程式無法滿足快速成長的組織,所以只好重起爐灶,重新開發新的系統,以滿足需求。 由於撰寫的是網頁程式,所以採用了ASP.NET來應付,雖然不是第一次寫網頁程式,不過大概是因為我在資訊業的資歷不深吧,第一次看過1、200個使用者控制項在同一個頁面上出現的。 因為使用者說:「希望把所有的資訊都顯示在同一頁上,但是沒有資料的內容就不要出現了。」 第一個直覺的想法就是用ASP.NET + JavaScript來解決這個問題,於是UI設計完成了。 使用者又說:「我已經在醫院的系統裡輸入了很多資料,所以頁面上的資料請從醫院的HIS或LIS來取得,只要輸入病歷號,資料就應該幫我填得差不多。」 殊不知資料來源來自四、五個不同的系統資料源頭除了SQL Server、Tendon、Oracle、MySQL,除了判斷資料是否存在,還要判斷資料是否是最新的,好不容易花了時間解決的這些個問題後。 使用者再度說了:「頁面上的某些欄位填寫後,應該要根據某某規則或指引的條件,填寫其他欄位,不要讓我花這麼多時間來解決這個問題。」 於是又加入了後端的程式庫做判斷,然後把規則寫成了一個個的Method去呼叫,因為這些規則與指引是醫生或者醫院內的核心技術所以不能公開寫成JavaScript。 結果使用者又說了:「我每次填某一個欄位後畫面就會閃一次可不可以不要讓他閃阿?」 所以呢?聰明的你一定猜到,沒錯我用了ASP.NET的AJAX讓畫面不要在呼叫Method讓畫面閃爍,也就是Postback時不要reload頁面。結果光畫面載入就要花近5分鐘,因為有1、200個控制項要處理。唉~~接下來不用使用者說我也知道...

C#中如何列出本機IPv4的位址

在撰寫C#程式中,我們通常可以透過如以下方法來取得本機的所有IP位址。 using System.Net; //加入 using System.Net.Sockets; //加入 /*------ 要先using上面兩個Class ------*/ /*------ Method Start ------*/ private static IPAddress[] getIPList() { return System.Net.Dns.GetHostEntry(string.Empty).AddressList; } /*------ Method End ------*/ 但目前IPv4仍然是主流,IPv6僅是作業系統提供的功能,並未實際被使用,因此上述Method所取得的IP Address,還是不符合使用,如何將取得的IP Address僅列出IPv4的部分就需要加點工了,幸好.Net Framework中已經幫你解決了這個問題,我們僅需要透過Array.FindAll這個Method來查找IPAddress[] 中的AddressFamily符合AddressFamily.InterNetwork,只要符合的IP Address就是IPv4的位址。 using System.Net; //加入 using System.Net.Sockets; //加入 /*------ 要先using上面兩個Class ------*/ /*------ Method Start ------*/ private static IPAddress[] getIPv4List() { IPAddress[] ipv4Addresses; ipv4Addresses = Array.FindAll(Dns.GetHostEntry(string.Empty).AddressList, a => a.AddressFamily == AddressFamily.InterNetwork); return ipv4Addresses; } /*------ Method End ------*/

搭配ASP.NET的AJAX使用JQuery

Abstract: 如果在使用了AJAX的ASP.NET網頁中 透過JQuery設定初始值 會發現當在Update Panel中執行Postback JQuery並不會被觸動 該怎麼辦呢? Method: 將需要在Update Panel中執行Postback的Script放入 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args) { //ScriptInHere } 如 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args) { alert(“Hello User”); } 就可以解決這個問題 Reference: 1. jquery datepicker ms ajax updatepanel doesn’t work after post back [ http://stackoverflow.com/questions/520645/jquery-datepicker-ms-ajax-updatepanel-doesnt-work-after-post-back ]

讓網頁在Postback後仍然回到原來檢視區域

Abstract: 許多ASP.NET的開發者需要讓使用者在檢視頁面的時候進行Postback,如[存檔]功能,但若頁面超過一定的檢視區域後,常常會因為Postback而導致畫面回到最上面,透過以下方法就可以解決此問題。 Method: 1. 單一頁面提供 在.aspx頁面的最上面<%@ Page > 加入MaintainScrollPositionOnPostback="true", 如: 2. 全網站系統每個頁面都提供 在 Web.config中找到<page>加入maintainScrollPositionOnPostBack="true", 如: Reference: 1. Page.MaintainScrollPositionOnPostBack 屬性 [ http://msdn.microsoft.com/zh-tw/library/system.web.ui.page.maintainscrollpositiononpostback.aspx ]

安裝撰寫好的 Windows Service (手工版)

1.建立執行服務的 Windows 帳戶 建立名為 [帳戶名稱] 的新本機使用者帳戶。輸入密碼,並選取 [密碼永久有效] 核取方塊。 在 [系統管理工具>] 程式群組中,按一下 [本機安全性原則]。 使用 [本機安全性原則>] 工具,授予新帳戶 [以服務方式登入] 的權限。 2. 安裝 Windows Service 這個程序會使用 installutil.exe 公用程式安裝 Windows 服務,然後再啟動該服務。 開啟命令視窗,並將目錄變更為 [Service檔案所在目錄]。 執行 installutil.exe 公用程式以安裝服務。 installutil.exe  [Service檔案] 在 [設定服務登入] 對話方塊中,請輸入先前在程序1 中所建立帳戶的使用者名稱和密碼,並按一下 [確定]。 檢視 installutil.exe 公用程式的輸出,並確認已正確地安裝服務。 3.移除 Windows Service 開啟命令視窗,並將目錄變更為 [Service檔案所在目錄]。 執行 installutil.exe 公用程式以安裝服務。 installutil.exe  /u  [Service檔案] 在 [設定服務登入] 對話方塊中,請輸入先前在程序1 中所建立帳戶的使用者名稱和密碼,並按一下 [確定]。 檢視 installutil.exe 公用程式的輸出,並確認已正確地安裝服務。

給學生與軟體業新進的十招

莘莘學子與軟體業新進請聽聽在下的十招~對於這十招提供了一些基本的解釋也希望能以詼諧的方式幫助各位加深印象~相信這十招各位經過更多歷練後會有更多解釋~所以把這篇從原篇中獨立出來,希望能方便讀者參考:   第一招:看到問題唸十次 確認你記得問題下次還記得 確認你瞭解問題,沒有漏掉什麼要求 確認你以後踫到類似問題,還會想到它 確認你連做夢都會想到它~悲慘的程式設計師宿命~   第二招:程式不會寫,先開始寫註解 利用註解將問題描述,將問題做分析 把分析方法與解法都 document 起來~對你自己最有益處 直接註解而省略白紙,由註解行數的改變,讓你老闆知道你有在努力做~ 人家是用照片寫記憶~程式設計師是用文件寫記憶~   第三招:解法不會寫,先寫工具 一個複雜的問題,尤其是面對演算法相關的所謂困難部份,如果能把工具(諸如模擬)寫出來,這樣是比較容易找出解法的~ 工具總是可以拿來重覆利用的~這會讓你越寫越輕鬆~ 寫工具也是一種重要練習~   第四招:整個問題不會解,先解會解的 divide and conquer(偶稱它為個個擊破法) 不用多說,不知道網上查也會知道~ 就像寫論文一樣,如果無法提出所有問題的統一解決方法,限定一些條件來解 還有有時候一下就想最困難的問題,一來浪費進度、二來心情不佳、三來老闆可能把預算砍了因為沒有結果~所以先解會解的是經驗上的金玉良言~因為一來你花了20%完成了80%超越進度,老闆來拍肩膀了,二來你解了簡單問題心情大好,更覺得整個問題也沒什麼大不了,說不定困難問題因心情好(沒有專牛角尖)也就想到而解決了,三來老闆看你有成果說不定常拍你肩膀哩~(老闆這時候真好騙~可惜薪水不好騙)   第五招:查網路、問別人、看書獲取各種解題的資源 想想偶們還在用193x的理論,當然問題絕不可能只有你才踫到,一定粉多人早就見過了~只有你踫到的通常是你自己寫出來的bug~ 這是群策群力的時代,多找資源、人家的經驗和別人幫忙~ 對應於b, 現在這個社會最忌諱單打獨鬥, 那代表你不能 team work~ 增加知名度、人緣~ Social 粉重要~切記~切記~   第六招:暴力法求解再找最佳化 先求有再求好~ 有成果人家才看得見~不然做不出來,中間再怎...