顯示具有 jQuery 標籤的文章。 顯示所有文章
顯示具有 jQuery 標籤的文章。 顯示所有文章

實用Sublime Text 2套件整理(2012/12)

Sublime Text 2的延伸套件

文字編輯器在接觸Sublime Text 2之前大多以Notepad++為主,筆記本為輔。不過看過Kevin TsengSublime Text 2系列教學文之後,又花了一段時間來上手,發現Sublime Text 2這個又免費又付費的編輯器,實在是用程式設計師的角度來開發,而不是像一般編輯器是用編輯器的角度來開發,慢慢的喜歡上它,而且它多元化的輔助套件,和Visual Studio的擴充套件一樣,令Sublime Text 2加分不少。

以下整理我由A選到Z的套件,分類為安裝與選用,安裝是我正在安裝使用中的套件,選用是可依個人需求安裝使用。

Sublime Text 2實用安裝套件

  • Package Control

    必啟用,沒有它你就無法安裝擴充套件,快速鍵:Ctrl+Shift+P

    啟用請參考:啟用Package Control

  • BracketHighlighter

    讓你在撰寫如HTML程式碼時,能有高亮度提醒功能。請參考以下官方圖片:

    BracketHighlighter功能說明圖
  • ColorHighlighter

    當的游標移至文字中如"#FFFFFF","rgb(255,255,255)","white"會自動顯示對應的顏色。當然,用在CSS居多。

從EverNote的求職需求看未來開發人員應有的技能

EverNote的求職需求

此篇靈感來自Johnny.Net的Plurk,Johnny.NET貼了一個EverNote的求職連結,從中我們可以看到一些趨勢,我簡單做個整理,各位開發者做個Check List,其中你擁有了幾項技能。

EverNote技能需求

EverNote 職位職責

EverNote技能需求職責

這裡的關鍵點有幾個:

  1. HTML5/CSS/JavaScript的應用程式

    這裡談的是應用程式,不單只是網站網頁,我會強調在application app。

  2. prototype(原型),我猜這是指JavaScript裡的原型,通常使用到prototype都已經是JavaScript裡的物件導向(OOP)。以前JavaScript可以隨便寫寫,能動就好,現在連JavaScript都開始走物件導向(OOP)。

EverNote 技能最低需求

EverNote技能最低需求

這裡的關鍵點有幾個:

jQuery - Selectors (8) Form - 表單選擇器

jQuery表單選擇器簡介

表單(form)為網頁與使用者互動最主要的元素,而表單選擇器可讓我們可以得知目前表單的狀態,進而進行相關處理。

jQuery表單選擇器速查表

jQuery表單選擇器
選擇器 說明 範例
:button 選擇button元素和type="button"的input元素 $(':button')
:checkbox 選擇type="checkbox"的input元素 $(':checkbox')
:checked 選擇已勾選(checkbox)或已選擇(radio)的input元素 $(':checked')
:disabled 選擇設定disabled屬性的input元素 $(':disabled')
:enabled 選擇未設定disabled屬性的input元素 $(':enabled')
:focus 選擇目前焦點所在的元素,注意,不限於input元素 $(':focus')
:file 選擇type="file"屬性的input元素 $(':file')
:image 選擇type="image"屬性的input元素 $(':image')
:input 選擇input、textarea、select、button元素 $(':input')
:password 選擇type="password"屬性的input元素 $(':password')
:radio 選擇type="radio"屬性的input元素 $(':radio')
:reset 選擇type="reset"屬性的input元素 $(':reset')
:selected 選擇所有option元素裡被選擇項目 $(':selected')
:submit 選擇button元素與type="submit"屬性的input元素 $(':submit')
:text 選擇type="text"屬性的input元素 $(':text')

jQuery - Selectors (6) Child Filter - 後代過濾器

jQuery後代過濾器簡介

由名稱來看,可以很容易了解此過濾器主要是處理一些後代元素選擇動作。我們在基礎過濾器(Basic Filters)中介紹過:even與:odd,這兩個過濾器常使用於表格的處理,但如果今天我們以三的倍數來計算呢?例如,第3,6,9…行進行處理呢?怎麼做?

jQuery後代過濾器速查表

jQuery後代過濾器
過濾器 說明 範例
:first-child 選擇所有父元素下的第一個子元素 $(':first-child')
:last-child 選擇所有父元素下的最後一個子元素 $(':last-child')
:nth-child(index/even/odd/equation) 選擇元素集合裡第幾個指定的子元素 $(':nth-child(1)')
:only-child 選擇所有父元素下只有一個子元素 $(':only-child')
基本動作有第一個後代元素,最後一個後代元素,只有一個後代元素,n倍數的後代元素,比較難懂的只:nth-child這一個後代過濾器。

jQuery - Selectors (5) Attribute - 屬性過濾器

jQuery屬性過濾器簡介

屬性過濾器針對HTML元素裡的屬性及屬性值來進行過濾與選擇的動作。例如,<a href="http://blog.kkbruce.net">KKBruce Blog</a>,我一天我想幫整個網站裡的連結加上target屬性,怎麼加?打開編輯器,一頁一頁慢慢看慢慢加?用搜尋目錄來取代?

jQuery屬性過濾器速查表

jQuery屬性過濾器
過濾器 說明 範例
[name|="value"] 選擇指定屬性等於字串值或以該字串為前綴的值(以字串後跟著一個連字符號"-")的元素。
這個過濾器是引入CSS規範來處理語言屬性。
$('[attribute|=value]')
[name*="value"] 選擇指定屬性包含特定字串值,不論在字串中的位置 $('[attribute*=value]')
[name~="value"] 選擇指定屬性包含特定字串值,字串用空格分隔 $('[attribute~=value]')
[name$="value"] 選擇指定屬性的字串是以字串值結尾
這個比較區分大小寫。
$('[attribute$=value]')
[name="value"] 選擇指定屬性的字串等於字串值 $('[attribute=value]')
[name!="value"] 選擇沒有指定屬性的元素,或指定屬性的字串不等於字串值 $('[attribute!=value]')
[name^="value"] 選擇指定屬性的字串是以字串值開頭 $('[attribute^=value]')
[name] 選擇所有具有指定屬性的元素,該屬性的字串可以是任何值。 $('[attribute]')
[name="value"][name2="value2"] 選擇符合所有指定屬性過濾器的元素 $('[attribute1=value1][attribute2=value2]')
attribute是一個屬性名稱,value是一個字串值,字串值的單雙引號(""或'')是選擇性,例如,$('[attribute|=value]')或$('[attribute|="value"]')都是正確的。

jQuery - Selectors (7) Visibility Filter - 能見度過濾器

jQuery能見度過濾器簡介

網頁中並不是所有元素都是可見的(或顯示出來的),例如,<script>、<style>,有一些是刻意隱藏起來的,當我們想要找出被隱藏的元素或目前UI上顯示的元素,就可以使用能見度過濾器來進行過濾選擇。

jQuery能見度過濾器速查表

jQuery能見度過濾器
過濾器 說明 範例
:hidden 選擇所有隱藏的元素 $(':hidden')
:visible 選擇所有可見的元素 $(':visible')

jQuery - Selectors (4) Content Filters - 內容過濾器

jQuery內容過濾器簡介

內容過濾器作用在找出元素內是否含有內容或關係,以產生所需要集合元素。

jQuery內容過濾器速查表

jQuery 內容過濾器
過濾器 說明 範例
:contains(text) 選擇包含指定文字(text)的元素。 $(':contains(text)')
:empty 選擇沒有子元素的元素(包含文字節點)。 $(':empty')
:has(selector) 選擇包含有selector的selector。 $(':has(selector)')
:parent 選擇包有父子元素的元素(包含文字節點)。 $(':parent')
:empty與:parent可以說是相反關係,:empty要沒有子元素,:parent要有父元素。而:has()的描述比較繞舌,看下面實例比較好理解。

jQuery - Selectors (3) Basic Filters - 基礎過濾器

jQuery基礎過濾器簡介

基礎過濾器,是用來進行一些元素過濾之用,雖然名稱上是Basic(基礎、基本),也就是實用性非常的高,才會放在此一分類中,記得,越基礎的東西越重要。

jQuery基礎過濾器速查表

jQuery基礎過濾器
過濾器 說明 範例
:animated 選擇所有正在執行動畫效果的元素 $(':animated')或.filter(":animated")
:eq(index) 等於索引值的對應的元素,索引從0開始 $(':eq(index)')或$('Selector').eq(index)
:even 選擇奇數索引值對應的元素,元素1,3,5,...,:even會選擇元素1與元素3,即索引值的0,2,... $(':even')或.filter(':even')
:first 選擇第一個符合的元素 $(':first')或.filter(':first')
:gt(index) 大於索引值的對應元素,索引從0開始 $(':gt(index)')或$('Selector').slice(index)
:header 選擇所有h1,h2,h3,h4,h5,h6元素 $(':header')或.filter(':header')
:last 選擇最後一個符合的元素 $(':last')或.filter(':last')
:lt(index) 小於索引值的對應元素,索引從0開始 $(':lt(index)')或$('Selector').slice(0,index)
:not(Selector) 排除selector內元素 $(':not(selector)')
:odd 選擇偶數索引值對應的元素,元素2,4,6,...,:odd會選擇元素2與元素3,即索引值的1,3,... $(':odd')

基礎過濾器提供了特定規則的過濾條件,讓我們很方便快速找到我們想要的元素,以進行處理。例如,第一個元素、最後一個元素、反向選擇元素、奇數元素、偶數元素、索引值index元素等。

ASP.NET Web API 心得筆記 (1)

ASP.NET Web API 是一個框架(framework),能讓你在 .NET Framwork 之上架設 HTTP 服務 (HTTP Services)。ASP.NET Web API 是 .NET Framework 上建置 RESTful 應用程式的理想平台。

在 Julie Lerman's 的 How I see Web API 一文中,用了一張圖來簡明說明 Web API:

比較 WCF 與 Web API
圖一:比較 WCF 與 Web API from thedatafarm.com
註:以下內容,會使用 Visual Studio 11 Beta 來實作,因 VS 11 還未有正體中文版,與 VS 11 相關步驟會使用英文。另外,可順便先熟悉 VS 11 開發環境。除簡化的圖示不談,整體開發功能是更上一層樓。

建立 Web API 專案


開啟 VS 11 → Start → New Project → Installed → Templates → Visual Basic → Web → ASP.NET MVC 4 Web Application → 在 Name 輸入 "HelloWebAPI" → OK

選擇 ASP.NET MVC 4 專案
圖二:選擇 ASP.NET MVC 4 專案
在 New ASP.NET MVC 4 Project 裡選擇 Web API 然後點擊 OK。

選擇 Web API 樣版
圖三:選擇 Web API 樣版
這裡有個有趣的地方。
之前,我在接觸 ASP.NET MVC 3 時,有點想去學 Razor 語法,因為大家一直強調 Razor 的好處,也讓我小小心動,不過,每一次接觸這種 v1 東西總是讓我碰壁,在 Visual Studio 2010 + Visual Basic 2010 + MVC 3 + Razor 環境裡,Visual Studio 2010 當的不像話,隨便打個 @html. 就可以當好幾次,後來還是把心思放在 MVC 上就好。但在 Visual Studio 11 裡中,VB中 Web API 只的支援 Razor,資料沒看錯的話,Visual Studio 11中 是 Razor v2。目前還沒有去 View 裡認真玩,簡單打一些 keyword 是沒有之前當掉情況,未來有 VB for Razor 的心得,再寫上來。

加入 Model

Model 是在應用程式中使用物件(object)方式來表現資料。ASP.NET Web API 能自己序列化(serialize) 你的 Model 成為 JSON、XML 或其他資料格式,然後寫入這些已序列化資料到 HTTP 回應訊息 (response message) 的主體 (body) 中。只要用戶端 (client) 能讀取序列化格式,它就能反解析序列化成為物件。許多用戶端都能同時解析 XML 與 JSON。而且,用戶端可以在 HTTP 請求訊息 (request message)的 Accept header 裡直接設定那種格式 (JSON, XML, Other) 是要接受的。

有沒有很心動?我們先加入一個 Products Model。

jQuery - Selectors (2) Hierarchy - 階層選擇器

jQuery階層選擇器簡介

當我們所要選擇的元素,含有一定的階層關係時,就非常合適使用階層選擇器,例如,<ol>與<li>元素,<ol>一定是<li>父層,<li>一定是<ol>的子層,<li>與<li>之間是平輩關係。又例如,假設我們發表文章,文章是包含在一個<div>元素裡,此<div>元素的id名稱為Post,我想要針對此<div>元素的每一段落(p元素)進行CSS調整,因為我不知道文章本文會有多少段落,如果要使用基礎選擇器,將難以撰寫!DOM本身就是非常結構化、階層化,利用階層選擇器,我們可以很簡單使用如$('div.Post p')或$('div.Post > p')來選擇特定區域裡或符合我特定階層條件的元素來進行相關處理。

jQuery階層選擇器速查表

jQuery階層選擇器
選擇器 說明 範例
parent > child 重點在">"符號。父子階層,上下兩層關係,一個父能有多個子。回傳多個子元素,只包含第一層。 $('ul.topnav > li')
ancestor descendant 重點在兩選擇器之間的"空格"。祖孫階層,上下多層關係,一個祖能有多個孫(孫、曾孫、太孫…),且孫不限多少層。回傳多個孫元素(descendant)。 $("form input")
prev + next 重點在"+"符號。前後階層,前後兩層關係,似類排隊,一前一後的關係,記得"+"是"緊接著"下一個。回傳符合next元素。 $("label + input")
prev ~ siblings 重點在"~"符號。兄弟階層,平輩、同輩階層關係,左右關係,記得"~"像"水平"、"平行線"。回傳多個兄弟元素(siblings)。 $("#prev ~ div")

這裡介紹的四個階層選擇器">"、"空格"、"+"、"~",都是重要的基礎選擇器延伸應用,必須了解清楚。在使用階層選擇器時,要小心考慮進入點,我們通常要想要進入點之後的元素,一個清楚的進入點,可以讓程式運作上更有效率。

jQuery - Selectors (1) Basics - 基礎選擇器

jQuery基礎選擇器簡介

以下是最基本,也是jQuery裡最簡單也最重要的一節,沒有了它,jQuery 可以說無法作運。所有的jQuery都是以它為開頭。

jQuery基礎選擇器速查表

jQuery 基礎選擇器
選擇器 說明 範例
* 選擇所有元素。 $('*')
.class 選擇所有符合class的元素。 $('.PostFont')
element 選擇所有符合標籤名稱(Tag name)的元素。 $('div')
#id 選擇一個符合id屬性的元性。 $('#NavBar')
selector1, selectorN, ... 選擇指定的元素。 $('div,p.PostFont,#NavBar')

除了*選擇器外,其他都是非常常用的選擇器,一定要好好了解。

jQuery - 入門語法基礎教學筆記

jQuery非學不可

jQuery 在很短的時間內,不只有爆紅,更成為顯學。重更要的是,微軟更直接宣布 jQuery 與 .NET Framework 的緊密結合,不但讓 jQuery 直接內建於Visual Studio 2010,下一代的Visual Studio 11 更是完完全全採用 jQuery 來發展,像 ASP.NET MVC 4 除 jQuery 外,也直接採用 jQuery Mobile 來發展相關 Mobile UI。

由以上來看,以前jQuery你可以要學不學。但現在是非學不可。

我剛觸 jQuery 時,版本是 jQuery 1.2.6,但接下來的 jQuery 1.3.x、jQuery 1.4.x、jQuery 1.6.x,到目前最新的jQuery 1.7.x,改變很多。

我想整理一份 jQuery 簡易入門語法資料表,以便隨時自我查詢,這份資料表定義在入門語法及範例查詢,基本架構如下。

jQuery 入門語法基礎教學架構

每一篇會以一個小主題為主,分為:
  • 前言:簡單說明此小主題的內容
  • 表格:將此小主題的 jQuery語法整理成一分小表格
  • 範例:為簡省時間,我想要直接複製 jQuery.com 範例,複製範例不同處,我會加說明及註解,讓大家快速了解。最好是有什麼靈感,可以自行創作!
  • 歷程:因為jQuery改版速度不慢,這裡算是半強迫"Me"要去"Update, Upgrade"腦中相關資訊,不要引用的是 jQuery 1.7.x,但寫的是jQuery 1.2.6的程式碼
各位想要測試 jQuery 範例,我推薦使用 Darkthread Mini jQuery Lab,我有想過使用另一套 jsFiddle 來儲存範例,讓大家直接線上看執行結果,但jsFiddle對於"複製、貼上"很 XD,還是黑大的 Mini jQuery Lab 方便許多。

最後,希望各位針對撰寫的內容上不吝指教。

2012 A Best Present "Microsoft MVP Award"

我只是一個平凡人,如果我能,你也能。by KKBruce
首先,我一定要感謝我最愛的家人們,不管什麼時候、什麼事,你們都永遠支持我。再來感謝所有幫助過我的人,因為有你們的表率,讓我有學習的對象,讓我有機會成為一位Microsoft MVP。

2012年最棒的一份新年禮物,那就是我當選2012年 Microsoft MVP

KKBruce Microsoft MVP獎項
圖一:Microsoft MVP獎項
KKBruce 2012 Microsoft MVP獎盃
圖二:2012 Microsoft MVP獎盃

Microsoft MVP得獎感言

我不知道,我是不是很「感覺」的人?為什麼說很感覺呢?從開啟這個KingKong Bruce記事已經快滿5年的時間,除了一些在生活上的感想外,主要有很大一部分是以技術為主的文章內容,在學習這些以Microsoft為主的技術路上,常常覺得這些Microsoft MVP對於技術出神入化,只有嘆為觀止可以形容,常常有那種抬頭看天的感覺,人就是那麼奇怪,想追求平凡又不甘於平凡,我給自己一個夢想,想像有一天我也能成為一位Microsoft MVP

從有那個夢開始,我慢慢觀察網路上這些Microsoft MVP,我發現我錯了,這些Microsoft MVP們除有擁有技術外,更重要的是有一顆幫助別人的心,你很難想像,一位未曾謀面Microsoft MVP,使用MSN從頭到尾只和你聊"程式",有空還會問你說,最近還有沒有什麼新鮮貨(新文章),害得我想不長進都不行。

還有,當你看到突然有Microsoft MVP跑來你的Blog上指導時,我心想,我只是個無名小卒,怎會讓這些大腳、起大腳(台)的Microsoft MVP願意來我的Blog上指導我,意外之外,我了解到技術非第一,還是那句「有一顆助人的心」。

去年年底,不知道為什麼,我很想、非常想、超級想試試看去申請Microsoft MVP,我就在MSN上問Allen大大一些關於Microsoft MVP資格問題,原來申請Microsoft MVP有二種方式:
  • 毛遂自薦
  • 他人推薦
我是自己寫信去 mvpga@microsoft.com 要申請表格來填寫,不過好玩的事是幾天後,我在Plurk上收到一則私人息訊,發訊者是現任Microsoft MVP 91哥,他問我要不要去申請Microsoft MVP,我又嚇到了,這些Microsoft MVP的通靈能力也太強了吧!我又沒和任何人提過我想申請Microsoft MVP,感謝之餘,更讓我確定要去申請這個Microsoft MVP獎項。

在我寄送出申請表格之後的幾週後,有一天我的E-Mail裡寄來一封信,怎麼是Microsoft MVP的申請表格,一看,原來是我的老師MISLab2000寄來的,我很不意思說我已經寄出申請表格了,不過我心想,看來我的感覺是對的,就是這一次。

身體健康最重要

我要在得獎感言最後寫得病的心路歷程。可以得這個獎,我還感謝我的病「甲狀腺機能亢進」。

約半年多前的幾個月,我變成了超人,因為經常性失眠,這個失眠不是睡不著,而是睡一下下就睡飽了,天未亮雞未啼人已起,起來沒事做,就坐在電腦前看看資料、寫寫文章,所以今年文章的產量非常不錯。

因為平常坐得久,都有在小心控制飲食,就在發病的那一個月裡,我突然廋了十三公斤之多,我才在想怎麼這個月的效果超好,可以把心得拿來出書賺點奶粉錢,就在幾天後的早上,我帶著小花去散步,才走沒多久就覺得不舒服,回到家已經是臉色慘白加喘不過氣。

那個月的平均心跳在140上下,常常感到累而就在我家地板上睡著,選擇在地板上睡是因為很熱,心跳快加上新陳代謝也快,所以那一二個月的時間,我都無法在床上睡覺,醫生說,我那時的新陳代謝就算坐著不動,也是平常人的三~四倍,難怪會廋那麼快。

這讓我想到一位Visual Basic的前輩王國榮,我們那個年代,大概學Visual Basic的沒有一位不拜讀他的作品,後來好像生病引退了。

追求不平凡,要有健康的身體。

申請Microsoft MVP參考資料

  1. 什麼是微軟最有價值專家?
  2. 申請Microsoft MVP報名表
  3. Microsoft MVP常見問題集

ASP.NET MVC - DatePicker 日期選擇器 | (1) jQuery UI : DatePicker

jQuery UI : DatePicker

表單第四篇,我們來終於來到日期選擇器(DataPicker)。

在表單上最容易產生的錯誤就是「輸入錯誤」,例如,我們網站裡的客戶註冊資料,明明就已經設計電子郵件必須輸入兩次,而且兩次必須完全相同才能通過驗證,還是會有客戶發 Mail 來說:「對不起,我 Email 輸入錯誤,請幫我修正資料。」一整個 Orz!

所以能「勾勾、選選」是最好的選擇,最少能減低這類的「輸入錯誤」。其中「日期」的輸入通常都是很重要,註冊日期、購買日期、出貨日期、銷售日期、保固日期、發佈日期、LogOn-LogOut日期…等。

前面介紹的 HTML 編輯器,是美化你輸入的資料。有時"日期"就重要性而言,會比內容更為重要。我們希望減少日期的輸入錯誤,但一個字一個字打,日期的錯誤率就硬是比Email這類資料還高。

所以就出現「用選的」這類需求。就有人開發出 DatePicker,讓使用者可以很方便,用選的,幾年幾月幾日,一整個就是爽。不管是 UI、Usability … DatePicker 與 HTML Editor 都是加分部分。

前面準備一樣,Model、Controller \ Action、View。

Model:BlogPostjQueryUI.vb

Imports System.ComponentModel.DataAnnotations

''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostjQueryUI
    ' 標題
    Public Property Title() As String
    ' 發佈日期
    <DataType(DataType.Date)>
    Public Property PostedOn() As DateTime
    ' 標籤
    Public Property Tags() As String
    ' 內容
    Public Property Content() As String
End Class

Controller \ Action:BlogPostjQueryUIController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostjQueryUIController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostjQueryUI/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostjQueryUI) As ActionResult
            ViewBag.HtmlContent = model.Content
            Return View(model)
        End Function

    End Class
End Namespace

建置,用強型別新增View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostjQueryUI)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : DatePicker (使用jQuery UI) 日期選擇器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>DatePicker (使用jQuery UI) 日期選擇器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>jQuery UI 日期選擇器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<div>
    <%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>

</asp:Content>

日期選擇器( DatePicker ) 第一個我們來介紹最簡易入門的 jQuery UI。

ASP.NET MVC - HTML 編輯器 | (3) CKEditor + CKFinder

CKEditor + CKFinder

最後一個 HTML 編輯器,我要介紹王牌 CKEditor

可能是因為版權的關係,我不清楚。目前沒有人把 CKEditor 整合到 NuGet 上。我們必須做一些事,才能在 ASP.NET MVC 上整合 CKEditor。

先下載 CKEditor 3.6.2

這裡請注意,請下載第一個 CKEditor Source 版本即可,不要下載 for xxx 版本,例如,CKEditor for ASP.NET 版本。

解壓縮後,把 ckeditor 目錄整個複製到專案的根目錄之下。

CKEditor 目錄位置
圖一:CKEditor 目錄位置
然後先一樣準備我們的 Model、Controller / Action 、View。

Model:BlogPostCKEditor.vb

''' <summary>
''' Blog 發表文章類別
''' </summary>
Public Class BlogPostCKEditor
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    
    Public Property Content() As String 
End Class

Controller / Action :BlogPostCKEditorController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostCKEditorController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostCKEditor/Create

        Function Create() As ActionResult 
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostCKEditor) As ActionResult
            ' 在充許 HTML 的欄位,切記必須使用 AntiXSS 4.0 過濾
            ViewBag.HtmlContent = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(model.Content)
            Return View(model)
        End Function

    End Class
End Namespace

先「建置」,用「強型別」產生 View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostCKEditor)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : CKEditor HTML編輯器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>CKEditor HTML編輯器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>CKEditor HTML編輯器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.TextAreaFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML標籤):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index","Home") %>
</div>

</asp:Content>

注意,要把 Content 欄位的 EditorFor() 修改為 TextAreaFor(),接下來我們就來 ASP.NET MVC 裡使用 CKEditor 與 CKFinder 吧!

ASP.NET MVC - HTML 編輯器 | (2) CLEditor

CLEditor HTML 編輯器

第二個我們來介紹 CLEditor HTML 編輯器。

前面準備步驟與前一篇差不多,在同一專案下,先準備 Model 、Controller\Action、View,而且內容 90%以上相同。

Model:BlogPostCLEditor.vb

''' <summary>
''' Blog 發表文章類別
''' </summary>
Public Class BlogPostCLEditor
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    <AllowHtml()>
    Public Property Content() As String 
End Class

我們先設定Content() 的屬性 <AllowHtml()>。

Controller \ Action:BlogPostCLEditorController.vb

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostCLEditorController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostCLEditor/Create

        Function Create() As ActionResult 
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostCLEditor) As ActionResult
            ' 在充許 HTML 的欄位,切記必須使用 AntiXSS 4.0 過濾
            ViewBag.HtmlContent = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(model.Content)
            Return View(model)
        End Function

    End Class
End Namespace

先「建置」,以強型別來新增View。

View:Create.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostCLEditor)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : CLEditor HTML編輯器測試
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>CLEditor HTML編輯器測試</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>CLEditor HTML編輯器測試</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML效果):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index", "Home") %>
</div>

</asp:Content>

接下來我們就可以來安裝及設定 CLEditor HTML 編輯器。

ASP.NET MVC - HTML 編輯器 | (1) TinyMCE

TinyMCE HTML 編輯器

第一個 HTML 編輯器,我們介紹 TinyMCE HTML 編輯器。

Step 1. 開一個全新 ASP.NET MVC 3 專案

檔案 → 新增專案 → Visual Basic → Web → ASP.NET MVC 3 Web 應用程式 → 名稱:「Mvc3HTMLEditorAndDatePicker」→ 網際網路應用程式 → 檢視引擎:「ASPX」。

未來六個範例,都會在此專案內增加進來。

Step 2. 準備一個 Model:BlogPostTinyMCE.vb

''' <summary>
''' Blog 發佈文章類別
''' </summary>
Public Class BlogPostTinyMCE
    ' 標題
    Public Property Title() As String 
    ' 發佈日期
    Public Property PostedOn() As DateTime 
    ' 標籤
    Public Property Tags() As String 
    ' 內容
    Public Property Content() As String 
End Class

以上內容很簡單,未來幾個範例,也會使用以上架構 Model 架構來進行。

Step 3. 建立一個 Controller:BlogPostTinyMCEController.vb

在「加入控制器」裡的「Scaffold 選項」→ 「範本」→ 選擇「空白控制器」。然後寫一個 Create() 的 Action 方法。

Namespace Mvc3HTMLEditorAndDatePicker
    Public Class BlogPostTinyMCEController
        Inherits System.Web.Mvc.Controller

        '
        ' GET: /BlogPostTinyMCE/Create

        Function Create() As ActionResult
            Return View()
        End Function

        <HttpPost(), ActionName("Create")>
        Function Create_Post(model As BlogPostTinyMCE) As ActionResult
            Return View(model)
        End Function

    End Class
End Namespace

重點在第二個 <HttpPost(), ActionName("Create")> 方法中,參數要接收 BlogPostTinyMCE類別。然後新增我們 Create 的 View。

Step 4. 新增 Create Action 的 View

先建置專案 → Create → 加入檢視 → 勾選「建立強型別檢視」 → 選擇「 BlogPostTinyMCE」 → Scaffold 樣板:「Create」→ 完成。

完成後,我們簡單修改此 View。

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Mvc3HTMLEditorAndDatePicker.BlogPostTinyMCE)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    KKBruce : TinyMCE HTML編輯器
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>TinyMCE HTML編輯器</h2>

<%-- The following line works around an ASP.NET compiler warning --%>
<%: "" %>

<script src="<%: Url.Content("~/Scripts/jquery.validate.min.js") %>" type="text/javascript"></script>
<script src="<%: Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js") %>" type="text/javascript"></script>

<% Using Html.BeginForm() %>
    <%: Html.ValidationSummary(True) %>
    <fieldset>
        <legend>TinyMCE HTML編輯器</legend>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Title) %>
            <%: Html.ValidationMessageFor(Function(model) model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.PostedOn) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.PostedOn) %>
            <%: Html.ValidationMessageFor(Function(model) model.PostedOn) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Tags) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Tags) %>
            <%: Html.ValidationMessageFor(Function(model) model.Tags) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(Function(model) model.Content) %>
        </div>
        <div class="editor-field">
            <%: Html.EditorFor(Function(model) model.Content) %>
            <%: Html.ValidationMessageFor(Function(model) model.Content) %>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
<% End Using %>

<p>
    發表內容(顯示HTML標籤):<%: ViewBag.HtmlContent %>
</p>
<p>
    發表內容(顯示HTML效果):<%= Html.Raw(ViewBag.HtmlContent) %>
</p>
<div>
    <%: Html.ActionLink("回首頁", "Index","Home") %>
</div>

</asp:Content>

我們希望把含編輯後含HTML與實際HTML效果顯示出來,所以我們再最後加上幾行程式。我們把專案按「Ctrl + F5」執行起來,然後輸入「http://localhost:6944/BlogPostTinyMCE/Create」(記得改成你的 Port)的 Controller / Action。

預設表單
圖一:預設表單(點擊看大圖)
我們可以輸入資料,但都是純文字。

文字輸入
圖二:文字輸入
到目前為止,與一般表單沒有什麼不同。現在讓我們為此表單的 Content 加上 TinyMCE HTML編輯器吧。

jQuery - Multi-Version jQuery Cheat Sheet for PDF and iPad

jQuery 改版太快的困擾

家有一表,如有一寶。
如同我們每天都在查 MSDN 一樣,腦中要記的指令、參數、語法、條件…實在太多,所以手邊不管有個電子檔的速查表或印出來的紙本速查表,對於工作有實質上的幫助。

進步的太快,實在也是一種「困擾」,翻開我手邊的 jQuery 速查表,有 gscottolson.com/weblog 版本 jQuery 1.2 Cheat Sheet v1.0 (此網站已經改版);impulseStudios.ca 的 jQuery 1.4 Cheat Sheet;還有二張彩色 A3 全開 jQuery 1.3 Cheat Sheet。

我想,使用 jQuery 是很爽的事,但做 jQuery 速查表的人,應該很辛苦,先讓我說聲 Thank you。bugs 修正當然是越快越好,但其他 jQuery 新功能進化速度之快,也算少見。但每次改版就要上網找一次「jQuery 1.x Cheat Sheet」,又好像有點呆呆的。

今天來介紹一個新發現的好網站,它直接提供 jQuery 所有版本速查表。連我沒看過的 jQuery 1.0  ~ 1.6 都有。而且相當容易使用。

ASP.NET MVC - MVC 4 Developer Preview 新功能介紹(一)

為簡省抓圖時間,本篇圖是直接引用 http://www.asp.net/learn/whitepapers/mvc4-release-notes 的圖,特此告知,內文不在特別註明。如有版權問題,請通知我。

增強預設專案樣版

  1. 一個新技術 adaptive rendering,能讓預設的樣版板在桌上型瀏覽器手機瀏覽器運作良好,而不用任何客制化。
  2. 使用JavaScript來提供豐富的 UI。例如,ASP.NET MVC 4預設專案樣版中的 Login 與 Register 使用 jQuery UI 來顯示。(測試發現,目前只能在 ASP.NET MVC 4 for C#,能有此效果,ASP.NET MVC 4 for VB,雖然是新 UI,但未提供此效果。)
ASP.NET MVC 4 專案樣版 UI
圖一:ASP.NET MVC 4 專案樣版 UI

adaptive rendering 技術
圖二:adaptive rendering 技術

Log On 使用 jQuery UI 的效果
圖三:Log On 使用 jQuery UI 的效果

Mobile 專案樣版

Mobile 可以說是 ASP.NET MVC 4 的重頭戲,ASP.NET MVC 4 有很大一部分都是在加強 Mobile 瀏覽器的相容性。在測試時,因為沒有使用 Mobile 模擬器,基本上是可以正常在桌上型瀏覽器顯示及操作相關 Mobile 專案樣版。另注意,與上面一樣,目前 ASP.NET MVC 4 for VB 還未加入這個 Mobile 專案樣版,想過過癮的話,必須開 C# 專案才有。
ASP.NET MVC 4 手機專案樣版
圖四:ASP.NET MVC 4 手機專案樣版
它使用與 Internet Application 一樣的樣版,但介面上採用 jQuery Mobil,這讓它在 Touch 行動設備上的顯示與運作可以良好。

ASP.NET MVC 4 的顯示模式(Display Modes)

這裡所謂的顯示模式簡單的想,如果你是從手機瀏覽器來的 Request,我就回應手機版網頁給你,其他我就回應一般網頁給你。你也可以針對特別版本來設計其回應網頁,程式會自動判斷,然後回應。

新顯示模式,讓應用程式依 Request - Browser's 兩者相依關係來選擇

例如,
Destop Browser → Request → 回應 \Views\Home\Index.vbhtml
Mobile Browser → Request → 回應 \ Views\Home\Index.mobile.vbhtml
  • 如果你 Views\Shared 下包含 _Layout.vbhtml 及 _Layout.mobile.vbhtml (即ASPX裡的 Site.Master 主版頁面),同上,手機會使用 _Layout.mobile.vbhtml,其他會使用 _Layout.vbhtml。
  • 如果你 Views\Shared 下包含 _MyPartial.vbhtml 及 _MyPartial.mobile.vbhtml (即ASPX裡的 LogOnUserControl.ascs 或使用者控制項或部份檢視),當程式 @Html.Partial("_MyPartial") 運作時,同上,手機會使用 _MyPartial.mobile.vbhtml,其他會使用 _MyPartial.vbhtml。
你也能建立特別 views, layouts, partial views 給其他的設備,只要注冊新 DefaultDisplayMode Instance 到指定名稱,例如,"iPhone"。我們在 Global.asax 的 Application_Start 方法來註冊 iPhone 這個字串:

DisplayModes.Modes.Insert(0, New DefaultDisplayMode("iPhone") With { _
	.ContextCondition = ( _
        Function(context) context.Request.UserAgent.IndexOf( _
                          "iPhone", _
                          StringComparison.OrdinalIgnoreCase) >= 0) _
})

之後,如果是由 iPhone 所發出的 Request,程式就會去找 _Layout.iPhone.vbhtml 來回應。

ASP.NET MVC 4 測試心得

就目前 ASP.NET MVC 4 開發者預覽版的測試而言,一是 UI 上的改進二是 Mobile 的支援。 ASP.NET MVC 本身並無太大更動。另外我們也發現,從 ASP.NET MVC 4 這一版開始,全面使用 jQuery 相關技術,不管是 jQuery UI、jQuery Mobile,看來 jQuery 都快要變成基本技能、要求之一。

加油,我們的肝!

參考資料

使用NuGet安裝外掛時的相依性問題

在使用NuGet安裝jQuery外掛時出現相依性問題,訊息如下:

PM> Install-Package jQuery
Successfully installed 'jQuery 1.6.1'.
Install failed. Rolling back...
Install-Package : Conflict occurred. 'jQuery 1.5.1' referenced but requested 'jQuery 1.6.1'. 'jQuery.vsdoc 1.5.1' depends on 'jQuery 1.5.1'.
位於 行:1 字元:16
+ Install-Package <<<<  jQuery
    + CategoryInfo          : NotSpecified: (:) [Install-Package], InvalidOperationException
    + FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.InstallPackageCommand

之前NuGet是不會檢查相依性的,解決辦法是,進入「Add Library Package Reference」的「Installed packages」,然後移除相關相依性的packages,然後再安裝最新版本的packages即可。

另外也可以注意一下,專案根目錄下的packages.config,它會記錄目前NuGet所管理的packages狀況。