2012年8月30日 星期四

就是不給 New 之 封裝建構子

不給 New~ 不給 New~ 我就不給 New 物件~ 我就不給New呀 不給New呀 不給你New呀~



有時候某物件只希望以特定方法產生,而非所有人都能 new ,這時候只要封裝建構子即可

上面說的有點抽象,但是這個一定有看過

SqlDataReader 必須藉由 ExecuteReader() 產生

SqlDataReader 有點像是代理 SqlCommand 處理一些功能

他需要某些 SqlCommand 裡面的東東

但是如果誰都能 new 一個SqlDataReader

那可能會因為 缺少某些 SqlCommand 裡面的東東 而出錯

所以統一由 SqlCommand 所提供的 公開方法 來產生 SqlDataReader 物件

以確保每個 SqlDataReader 都能正常運作



正經範例如下



類別跟介面

實際運作的主類別



今天想要專業的人才說話 所以改寫如下



類別跟介面

實際運作的主類別

等等,なにかおかしい



這下演講將變得有點兒糟

那就不給 New 吧



類別跟介面

實際運作的主類別



這下就能徹底擺脫熊○的騷擾了

只有鬼知道的C# 第一彈 建構子小秘密

這個系列只介紹一些 少用 少見 或者 我孤陋寡聞 不知道的東西

[C#.NET] 為建構子建立正確的初始化

原本是貼另一篇的連結的 結果網頁竟然 404 了 沒備份真是不智 -.-

2012年8月28日 星期二

signalR 實驗紀錄簿 第二彈 內神通外鬼之 webForm 通 winForm

恩...沒啥好說 就看吧



兩專案 一WEB 一WIN

WIN Form1.cs 介面自由發揮

HUB /App_Code/myHub.cs

網頁 /WebForm1.aspx 其實用HTML就好了

最後玩弄畫面



飯粒黨:http://www.mediafire.com/?2fw2qjc74681i2y

2012年8月26日 星期日

一秒看破 static

static 靜態 是個很奇妙的 關鍵字

早在 哈囉,世界 的時候就看到 static void Main() 這個 加了 static 關鍵字的方法

但是在真正了解 static 的意義卻又是很久以後的事了

2012年8月25日 星期六

IE使用createElement生成iframe的BUG

很好,又一個IE BUG

當你嘗試用 document.createElement("iframe") 產生一個iframe時

iframe.name = "xxx";

IE 會把它解析成 submitName 而非 name

當你將 form 的 target 指向 iframe 的 name

並嘗試使用POST傳值給 iframe 時他會另開一個新分頁

而不會將 iframe 導向 action 指定的頁面

解決方法:

iframe.setAttribute("name", "xxx");

2013/04/30 補充

IE7 不能用 iframe.setAttribute("name", "xxx");

他還是會另開一個新分頁

解決方法:


//A (any browser)
var iframe = document.createElement('iframe');
iframe.name = 'frame_x';

//B (only in IE)
var iframe = document.createElement('<iframe name="frame_x"/>');

//C (use a JS library that fixes the bug (e.g. jQuery))
var iframe = $('<iframe name="frame_x"></iframe>');

//D (using jQuery to set the attribute on an existing element)
$('iframe:first').attr('name','frame_x');

http://stackoverflow.com/questions/2181385/ie-issue-submitting-form-to-an-iframe-using-javascript

2012年8月23日 星期四

那些年 The Boss 教會我的 MVC

長久以來搞不懂 ASP.NET MVC 在玩什麼把戲

雖然知道 MVC 是一個設計模式

將 Model View Controller 分離 已達成 易於擴充及維護的目的

理論歸理論 但是實際建立一個 ASP.NET MVC 專案之後 卻發現啥都不會用

而且綁手綁腳 隨便玩弄一下就報錯了 也不知哪裡有錯

更慘的是正體中文僅存的 MVC 書 是2.0的 還絕版了

英文...算了吧

這時神之音告訴了我一句話

2012年8月13日 星期一

PG的三大守則 & 三大職業道德


PG的三大守則

1. 不能忤逆剋滬,也不能忤逆漲鰥。

2. 絕不透露出剋滬有多愚蠢,除非剋滬想知道自己有多愚蠢。

3. 下了班就不是PG。即使喝醉了、睡夢中、做愛時,也得牢牢記住這點。

PG的三大職業道德

1. 絕不搶生意。摳頂沒有這麼好玩,賺錢也不是這種賺法。

2. 若辛苦寫的程式被玩壞,也絕不找同事報復,亦不可逼迫同事供出出餿主意弄壞的人。

3. 保持心情愉快,永遠不說出「這是最後一個BUG」。

2012年8月10日 星期五

validateRequest X JavaScript注入攻擊 X Jquery解法

不管老鳥菜鳥小小鳥,一定看過這個

沒錯,這就是 ASP.NET ValidateRequest 機制

他不允許提交的表單中有特殊的腳本字符

理由是防止 JavaScript注入攻擊 XSS攻擊 等等 (詳情估狗)

但是有時候不得不接收這些字符的提交,因為如果是個留言框,總不能禁止打/>_</這個表情符號吧

又或者根本就需要直接透過頁面編輯HTML,這都是滿常見的需求

最常見的解法是 validateRequest="false"

但是這就像他提供了一套防護衣,但是使你不能靈活運動,為了想要隨心所欲,乾脆全裸上陣

其實要穿防護衣還是要全裸不是真的那麼重要

重要的是到底使用者在提交表單的時候能不能夠安全又符合需求

第二種作法則是使用HTML Encode,將要提交的內容在前端先行編碼,到後端在做處理

HTML Encode 的方法又是方法千百種

先來看看 javascript 原生的編碼 function

escape、encodeURI、encodeURIComponent 的差異

原字串:<script>alert('中獎')</script>

escape()會轉成:%3Cscript%3Ealert%28%27%u4E2D%u734E%27%29%3C/script%3E

encodeURI()會轉成:%3Cscript%3Ealert('%E4%B8%AD%E7%8D%8E')%3C/script%3E

encodeURIComponent()會轉成:%3Cscript%3Ealert('%E4%B8%AD%E7%8D%8E')%3C%2Fscript%3E

雖然可以成功通過 ValidateRequest ,但是中文也變得又臭又長的編碼

於是又有人這麼做,用replace字串的方式把特殊的腳本字符轉換成 HTML 的跳脫字元就好了

例如 字串.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');

會轉成:&lt;script&gt;alert('中獎')&lt;/script&gt;

上述方法是參考 jquery.string.1.0.js 裡的 escapeHTML 方法

最後分享一個最近學到的Jquery解法

簡單來說,他就是透過一個 div 容器,將 input 的 value 放到 div 之中,再透過 .text() 跟 .html() 這兩個方法交互使用來轉換特殊字符

2012年8月9日 星期四

一秒看破 JSON

有首歌這麼唱:JSON JSON 滿天下 越傳它越強大~

就程式設計的角度來看其實XML比較好,可以直接使用洞操作(DOM)

但是要比速度就弱了,誰叫JSON是 輕量級的資料交換語言

雖然WIKI這麼叫他其實他骨子裡就只是個字串,讓後放些 { [ : , 隔開而已

JSON怎麼寫?我們來看看官方的說法

http://www.json.org/

很好資質駑鈍的我完全不知道他媽的在說什麼

直接看範例對照立馬就懂

還是不懂的話,就去立馬廄吧-.-

{[值],[值],[值]} 或 {"索引":[值],"索引":[值],"索引":[值]}

這是一個物件裡面很多陣列,偵錯起來看起來像這樣

[{"名稱":"值"},{"名稱":"值"},{"名稱":"值"}]

這是一個陣列裡面很多物件,偵錯起來看起來像這樣

{}包起來的是物件,[]包起來的是陣列

{}裡面必須要有 名稱:值

[]裡面只能有 值

可以為值的項目有字串、數字、物件、陣列、布林、NULL

雖然規則不嚴格,但是如果沒遵守$.parseJSON()就會報錯

容易出錯的地方:

物件裡面只有值 ex: [{"イヴ"},{"ギャリー"},{"メアリー"}]

不能給物件索引值/名稱 ex: ["Ib":{"イヴ"},"Garry":{"ギャリー"},"Mary":{"メアリー"}]

索引裡面寫成名稱:值 ex: {["Ib":"イヴ"],["Garry":"ギャリー"],["Mary":"メアリー"]}

JSON 骨子裡就是 Javascript 裡面的 陣列 跟 物件 這兩種東東改成字串的寫法

陣列只有數字索引值

personObjArray_JsonObj[0].enus == Ib

所以要由某個值取得項目必須要走訪全部的項目

除非有辦法事先得知索引數

物件的則是屬性,屬性可以命名

personObj.Ib.enus == Ib

personObj["Garry"] == Ib

※我用"項目"這個名詞來表示一組有獨立意義的數值組合,因為陣列跟物件都能達成,JSON的核心價值在於把每個項目分隔開來,以便走訪取值

兩派用法都能達成目的,因為Javascript的陣列跟物件都可以被for走訪,但是他們有著微妙的區別

但是個人偏好使用物件

因為我只需要知道名稱,我可以直接從Json 物件裡面 取得底下值

而不必用each走訪整個Json再取出值

2012年8月2日 星期四

拋棄CodeBehind將網頁cs檔放在類別庫之中

之前無意中看到的網站方案,一個WebApplication專案跟幾個ClassLibrary專案組成的

然而WebApplication專案底下的頁面竟然只有aspx,沒有aspx.cs跟aspx.designer.cs

也不是inline code,aspx裡面就只有些HTML沒程式碼

找了一會兒才發現它放在類別庫裡,問了高人才知道原來.cs檔是可以亂放的(只要你不要忘記你放到哪去)

揣摩了一下,把方法記錄下來

定番,一個WebApplication一個ClassLibrary

加入一個新頁面,一如往常會看到這3個檔案,如今aspx.cs跟aspx.designer.cs不要了,都刪掉

於aspx中刪除CodeBehind,並修改Inherits

於類別庫中建立testPage.cs內容如下(類別庫預設沒有參考System.Web 記得加)

執行吧

 

 

 

 

以上