2013年4月23日 星期二

CSS Attribute Selector Part II

自從上回從 Wiki 發現 CSS Attribute Selector 強大之處之後 又過了一段時日 CSS Attribute Selector

但是其實 CSS 還有一些小祕密 就讓我們來瞧瞧

1.複數class

這個應該還算常見 比如我有兩個樣式 .borderStyle .colorStyle

如果我需要某元素同時具有這兩種樣式的效果 我可以這麼寫


    <style>
        .borderStyle
        {
            border: 1px solid #999;
        }

        .colorStyle
        {
            color: blue;
        }
    </style>
    <div>
        <input value="aaa" class="borderStyle" type="button" />
        <input value="bbb" class="colorStyle" type="button" />
        <input value="ccc" class="borderStyle colorStyle" type="button" />
    </div>

但是如果我想要第三個按鈕再做些變化的話該怎麼寫? 咦? .borderStyle colorStyle 好像沒辦法 因為對 CSS 而言 空格是下一層物件的意思了 =3=

想想 Attribute Selector

我們的 HTML 是一種 XML 所以我們的 class 也是一種 Attribute

所以我們可以使用 Attribute Selector


    <style>
        .borderStyle
        {
            border: 1px solid #999;
        }

        .colorStyle
        {
            color: blue;
        }

        [class='borderStyle colorStyle']
        {
            padding: 10px;
            font-size: 16pt;
        }
    </style>
    <div>
        <input value="aaa" class="borderStyle" type="button" />
        <input value="bbb" class="colorStyle" type="button" />
        <input value="ccc" class="borderStyle colorStyle" type="button" />
    </div>

值得注意的是 我們仍需要小心 CSS 的順序性 如果有覆寫之前設定過的屬性 會以最後指定的為準





2.複數attribute

我們之前已經會了 使用 Attribute Selector 來設定樣式


    <style>
        [data-hasBorder='true']
        {
            border: 1px solid #999;
        }

        [data-hasBorder='false']
        {
            border: none;
        }

        [data-isBig='true']
        {
            font-size: 16pt;
        }

        [data-isBig='false']
        {
            font-size: 9pt;
        }
    </style>
    <div>
        <input value="aaa" data-hasborder="true" data-isbig="true" type="button" />
        <input value="bbb" data-hasborder="false" data-isbig="true" type="button" />
        <input value="ccc" data-hasborder="true" data-isbig="false" type="button" />
        <input value="ddd" data-hasborder="false" data-isbig="false" type="button" />
    </div>

如過這回我們想要在 同時符合兩項 Attribute 的元素 做變化該怎麼辦?

答案很簡單沒人說 [] 只能有一個


    <style>
        [data-hasBorder='true']
        {
            border: 1px solid #999;
        }

        [data-hasBorder='false']
        {
            border: none;
        }

        [data-isBig='true']
        {
            font-size: 16pt;
        }

        [data-isBig='false']
        {
            font-size: 9pt;
        }

        [data-hasBorder='true'][data-isBig='true']
        {
            color: red;
        }

        [data-hasBorder='false'][data-isBig='false']
        {
            color: green;
        }
    </style>
    <div>
        <input value="aaa" data-hasborder="true" data-isbig="true" type="button" />
        <input value="bbb" data-hasborder="false" data-isbig="true" type="button" />
        <input value="ccc" data-hasborder="true" data-isbig="false" type="button" />
        <input value="ddd" data-hasborder="false" data-isbig="false" type="button" />
    </div>





大會串一下


    <style>
        input#btn1.btn[data-hasborder='true'][data-isbig='false']
        {
            color: orange;
            font-size: 24pt;
        }
    </style>
    <div>
        <input id="btn1" class="btn" value="aaa" data-hasborder="true" data-isbig="false" type="button" />
    </div>

TagName#Id.Class[Attribute1='value'][Attribute2='value']

AngularJS in Web Form 之 SPA 明知山有虎 偏向虎山行 下篇

在上篇我們搞定了 Web API

但是 Web API 只是個負責提供資料查詢的角色

SPA (single page application) 顧名思義 一頁打天下

其中心思想自然落在 JavaScript 上頭

J蛞蝓是神兵 但是要用來 hold住 SPA 的小宇宙 略顯吃力

回顧上篇的 JavaScript DOM事件(click) → AJAX → callback → 更新DOM

這整串的流程都寫在一起

這樣跟把所有的程式碼寫在頁面.cs檔的一個 click 事件中 是差不多的意思

義大利麵式的 code 難以擴充維護





我願意相信團隊成員都有強大的 coding 能力 及 良好的代碼習慣 並且遵守一切共能訂定的規範......

那我就太傻太天真了





看清事實吧 我們需要一些 強大 簡單 美好的 框架 來拯救我們不堪一擊的 測試 跟 需求變更

因此 JavaScript 的 mv* framework 開始風行

但是另一項災難就是 這種 mv* framework 似乎各大行家都要搞一套出來證明自己風騷

除了常見的四天王之外

  Backbone.js

  Knockout.js

  Ember.js

  Angular.js

還可能有些聽都沒聽過的...

12种JavaScript MVC框架之比较





該怎麼選擇?到底哪個最好?有種永遠學不完的感覺...

其實很好挑 順從人類的性本能直覺 就跟挑OO一樣想跟誰OO就挑誰

挑你愛的 挑你順眼的 挑你爽的 挑你一看見它就衝動的

就算是 mv* framework 永遠會推陳出新 只要有愛就沒問題對吧





以上閒聊以下正題

正題就是繼上回玩過 Knockout 之後 這回我又搞上 Angular 啦

沒辦法 誰叫男人就是喜新厭舊的動物





馬上把上篇的東東 改寫成 Angular

但是只改寫太無趣 且無法彰顯 Angular 的強大之處

首先先從 Web API 下手 我們再增加一個 RoleDetail 類 讓它跟 Role 類 有主表明細的關係

然後修改一下 Web API 讓使用 id 的 GET 方法 傳回 RoleDetail

POST PUT 跟 Delete 則增加對 RoleDetail 的處理

POST 跟 PUT 所需的傳入參數 可能是我比較笨的緣故試不出來怎麼傳兩個類別

但是在建立一個 DTO 包含這兩個類別 卻行得通 好吧 就這麼辦吧

HTML 變這樣 ...

JS 變這樣 ...





欲知更多細節 請洽 http://docs.angularjs.org/api/

哈哈 不是我(就是想)想偷懶 而是這篇就說得太明白的話 後面沒東西好玩了

況且這麼多的 framework 先感受他的風格 再去了解細節也不遲 不要想 用直覺去感受





定番截圖





飯粒檔:http://www.mediafire.com/download/8jkajx99i2192jn/testAPI.zip

2013年4月22日 星期一

Web API in Web Form 之 SPA 明知山有虎 偏向虎山行 上篇

休息人人愛 REST也是

我亂講的 是不是人人愛我不知 至少是最近的顯學

而 ASP.NET Web API 則是微軟用他來證明自己也很潮 很RESTful

第一次參見 Web API 是在 MVC 4 上

他們相性很合直接使用無大礙

Web Form 則沒那麼好的待遇 誰叫微軟也是比較寵么子

同是自家 沒有不能用的道理 只是需要一些手段

就讓咱們來瞧瞧虎山之途





一隻老虎:是否2012

如果是 2012 的話 在加入新項目 可以直接選 Web APT 控制器類別

如果沒有 就直接建一般的類別 然後繼承 ApiController (需要將 System.Web.Http 加入參考)

類別名稱務必叫做 xxxController 預設命名多個 1 是陷阱

隨附範例代碼





設定 Routes

因為配合 MVC 所以它也是靠 Routes 來辨識 API 的路徑的

請在 Global.asax 設定以下東東 (需要將 System.Net.Http 跟 System.Web.Http.WebHost 加入參考)





需要 Json.NET

輸入 http://localhost:22354/api/Roles 如果能看到 JSON 的話代表我們通過第一階段

如果報錯 無法載入檔案或組件 'Newtonsoft.Json... 的話

沒有錯 我們需要Json.NET

定番 NuGet 一下搞定





接下來來看看怎麼玩 CRUD

首先需要一個 Role 類





再來當然是修改 RolesController 使他可以 CRUD 剛剛的 Role類

這裡先以 靜態的 List 來模仿 DB





接下來需要一個頁面 因為是 SPA 所以用一般 html 也沒所謂

寫些按鈕搭 JQuery 來測試 Get Post Put Delete

HTML:

JS:





截圖