這算是個練習的題目,原本覺得應該是個簡單的應用,沒想到實做下去遇到了幾個進階的操作,還蠻有趣的,用的是 ASP.NET Core WebAPI,但如果要用在 ASP.NET WebAPI 專案裡也是可以的,程式的部分並不會有多大的差異。寫程式的過程中還發想出不少的延伸應用情境,所以之後會有幾篇文章跟這篇的內容有所關連。
這篇文章會提到的內容:GZipStream, JsonConvert, AutoMapper
這算是個練習的題目,原本覺得應該是個簡單的應用,沒想到實做下去遇到了幾個進階的操作,還蠻有趣的,用的是 ASP.NET Core WebAPI,但如果要用在 ASP.NET WebAPI 專案裡也是可以的,程式的部分並不會有多大的差異。寫程式的過程中還發想出不少的延伸應用情境,所以之後會有幾篇文章跟這篇的內容有所關連。
這篇文章會提到的內容:GZipStream, JsonConvert, AutoMapper
以往在針對方法的執行結果進行資料排序的驗證時,比較直接的做法就是取得 collection 的第一筆與最後一筆,然後再依據用什麼條件做排序去比較兩筆資料,例如使用日期為條件而且是由新到舊的排序,那麼第一筆資料必須要比最後一筆資料的日期還要新,大概是用這樣的方式做資料排序的驗證。
不過這樣的做法還蠻土砲的,所以就用 Fluent Assertions 所提供的方法來處理吧。
題目有點難定,這麼做個簡單的說明,在一個使用情境裡會使用到同個類別的同個方法多次,然後第一次執行的結果與後續幾次的執行結果會有所不同。例如在一個使用情境裡,方法裡會使用到一個物件 collection,然後會去使用另一個類別的方法做多次處理(比方說,刪除),執行第一次與後續幾次的執行就會有不同的回傳結果。
如果要對這個使用情境去做單元測試時,以上的那個執行多次的類別方法是需要被隔離,使用 NSubstitute 建立 stub 與預期回傳值,那麼應該怎麼處理呢?
繼續上一篇「NSubstitute 練習題 - void 不回傳值方法但有使用到 out 參數」最後所提到的,當測試對象裡所使用的其他類別方法拋出錯誤時要怎麼去做這個情境的測試。
一樣是使用 NSubstitute 完成這一次的練習。
有關資料分頁的做法已經寫了許多篇文章來說明,而這一次的做法其實跟之前的也沒有什麼不同,使用的方法也沒有什麼不同,這邊只是使用「ASP.NET MVC 使用政府公開資料」這個範例繼續做延伸,在現有的範例程式裡再去做變化,而且「ASP.NET MVC 使用政府公開資料」這個範例有使用到 Async/Await 的非同步做法,不過實際在做的時候其實也與沒有使用非同步的一般做法是沒有多大的差別。
ASP.NET MVC 使用政府公開資料
ASP.NET MVC 資料分頁 - 使用 PagedList.Mvc:AJAX
其實這個功能在這兩年所帶的 ASP.NET MVC 實戰課程裡的一個部分,主要是用來講述如何製作一個自訂的 ActionResult,而剛好產生 RSS Feed 內容的功能並不算太複雜,所以不會使用到太長的課程時間,再加上在網路所搜尋出來有關 ASP.NET MVC 如何產生 RSS Feed 大多都還是用字串組合的方式,好一點的會用到 XmlWriter 操作。
今天剛好同事詢問這一個功能,所以就把課程裡有關 Rss Feed 的部分給翻出來,藉此瞭解如何自訂 ActionResult 以及如何使用比較好的方式來產生 Rss Feed。
上個月發佈了「練習題 - ASP.NET MVC 資料列表顯示 + 分頁 + 查詢 + FormMethod.Post」這一篇文章,我沒有想到這一篇的關注與迴響是這麼熱烈,讓我出乎意料,所以緊接著在月初的時候我就趕緊把之前有關使用 PagedList.Mvc 操作資料分頁文章裡的範例程式給重新做了整理,然後將這些範例程式給發佈到 GitHub 上面,但是更讓我感到訝異以及不可思議的是反應與前面那一篇有天壤之別,流量比例相當懸殊,我還真的猜不透呀!
「練習題 - ASP.NET MVC 資料列表顯示 + 分頁 + 查詢 + FormMethod.Post」這一篇文章裡的回應相當多,不過大部分都是一來一往的問答,但是這些問答都是反應這些朋友在看我文章然後去做出這些功能時會發生無法執行的錯誤,但是回應裡的訊息都沒有詳實的將錯誤發生的相關資訊跟我說,我有如瞎子摸象一般,根本毫無頭緒呀!
我這邊文章以及發佈的範例程式碼,都是經過我這邊再三測試並確定沒有嚴重錯誤以及可以正常執行後,我才會發佈出來,無論是你部署到本機端的 IIS 裡,或是發佈到 Windwos Server 裡,甚至是部署到 Microsoft Azure 上面都是可以正確執行的。
這是一個蠻常見的功能,使用 ASP.NET MVC 開發,將某一個資料以列表方式顯示,並且加上分頁功能,另外還要有查詢功能,而希望顯示分頁的時候可以保留查詢的條件(也就是查詢結果也要能夠分頁顯示),因為有可能查詢的欄位會有相當多個,所以不希望是以 Get 的方式讓查詢條件以 QueryString 的方式傳遞到後端,而是使用 Post 的方式來做傳遞(因為這不是用在一般的前台頁面,而是常見於後台的操作頁面)。
其實這樣的功能也不是相當複雜,我在之前的資料分頁文章也曾經做過說明,例如以下這一篇:
ASP.NET MVC 資料分頁 MVCPaging 2.0 應用 Part.1:一般、表單(Form)
不過這一次會有不一樣的方式來實作,分頁套件會使用「PagedList.Mvc」,因為查詢條件可能會有相當多個的情況,所以會建立一個 ViewModel 來使用,藉由這樣的一個範例說明可以讓初學者能夠瞭解類似這樣的需求應該要如何處理。
在課堂上介紹到在 View 所輸入的表單資料也能夠使用 FormCollection 取得輸入的資料,尤其是在前端頁面有動態新增文字輸入框的情況下,使用 FormCollection 來取資料會相當適合,因為不知道前端會增加多少個文字輸入框,所以後端也就不知道該取得多少資料。
以往的文章也都沒有寫過類似的內容,所以就把這個情境當做一個練習題。
前一篇文章「練習題 - LINQ Single Column Dynamic Group」練習了各種動態單一欄位的 Group 操作,這一篇則是要來練習動態多欄位的 Group 操作。
使用環境:VS2013, ASP.NET MVC 5, EntityFramework 6.1.0
使用資料庫:Northwind
這一次要練習的題目是怎麼作到動態選擇欄位做 LINQ 的 Group 操作,其實很少遇到需要在 LINQ 裡做動態 Group 的需求,所以就當做練習題目來練練看。
使用環境:VS2013, ASP.NET MVC 5, EntityFramework 6.1.0
使用資料庫:Northwind
很少在程式裡使用到 ArrayList 這個類別,所以一時間還沒有馬上意會過來,所以查了一下 MSDN 上面的說明:
MSDN - ArrayList 類別 (System.Collections)
這個類別有實作 IList 介面,而且使用大小會視需要而動態增加的陣列。
但如果我們要操作一段 LINQ 查詢,所使用的條件值是 ArrayList 而且輸出的結果也需要是 ArrayList 時,應該怎麼處理呢?
就來練習看看吧!
這個題目其實蠻簡單的,有時後會需要將接收到的 QueryString 再加以處理,因為 QueryString 是屬於 NameValue 的結構,如下:
ID=12345678&FirstName=OOO&LastName=xxx如果 QueryString 的內容不是又臭又長的時候,可以直接使用 HttpUtility.ParseQueryString() 方法將 QueryString 轉換為 NameValueCollection,然後可以依據 Name 來取得 Value 的內容。
但需要將 QueryString 轉成指定型別的物件呢?好像沒有內建的方法是可以直接將 NameValueCollection 轉成物件,不過還是有方法可以做這樣的處理,只是需要多做幾次簡單的轉換處理而已。
前一篇文章「jQuery 練習題:ASP.NET MVC 連動下拉選單與 jQuery UI Autocomplete ComboBox」是使用了 jQuery UI 的 Autocomplete ComboBox 來完成連動下拉選單的功能,其實想要在 ASP.NET MVC 網站裡做出 ComboBox 以及 Autocomplete 的功能也不是只能使用 jQuery UI,也可以使用其他的套件來完成,所以這一篇文章將會說明使用 jQuery EasyUI 的 ComboBox 來實作一個三層式的連動 ComboBox 選單功能。
嗯…… 我很少使用 jQuery UI,應該說除非必要,不然我不會在專案中去使用 jQuery UI,它是個好物,尤其是在專案需要一個整合性的前端 UI 處理介面又必須要與 jQuery 來搭配時,jQuery UI 往往是很多人的首選,但我還是很少會去使用它,因為總覺得就像開發 ASP.NET Web Forms 專案時去使用 Server Controls 或是 AJAX Control Tool Kit 一般,是可以帶來很多立即可見的功能,但如果想要在這個基礎上面去做客製的處理就必須要花時間與下功夫,我必須說 jQuery UI 是個好物,只是我對它真的很不熟,因為不熟所以也就會有上面的一些誤解看法。
既然不熟的話,那為什麼要寫這篇文章哩?
因為有位朋友向我問了有關 jQuery UI Autucomplete ComboBox 與連動下拉選單的問題,所以花了一點時間看文件並試做了類似情境的操作,覺得把這個過程給記錄下來以免日後遇到相似狀況時我會忘記怎麼做解決的。
這是一個老掉牙的一個功能,但問題就是常常都會有人問起,以往部落格也有針對連動式下拉選單寫了文章,
「jQuery 對下拉選單 DropDownList 的操作 - 2:連動下拉選單」
因為該文章的內容是有跟 ASP.NET MVC 做整合,所以對於有些沒有接觸過 ASP.NET MVC 的人就會看得模模糊糊的,很多對 Javascript 或是 jQuery 不熟的人做連動式下拉選單,大部分的情況就是直接 Google 然後找一個自己看得懂也改得動的來用,但問題是 …… 有了兩層式連動下拉選單就一定會有三層式連動下拉選單的需求,對於前端程式不是很熟悉而且只會複製貼上、修改的人來說,從兩層式連動換成三層式連動就會不知所措。
講這麼多,所以這邊文章接下來的內容就將會來練習如何做一個三層式連動的下拉選單,沒有 Server-Side 的程式,完全都是前端程式與文字資料的整合,所以看得懂的就看,看不懂的就回頭去好好練習 Javascript 與 jQuery,如果是想要找一個拿來修改就可以用的三層式連動下拉選單,可以就此打住而不必繼續往下,因為拿回去應該也不能用。
標題看起來很繞口而且也有些詞不達意,所以就簡單的用幾張圖以及說明文字來讓大家了解,
一般做網站都會有要製作圖文上稿的功能,有時候一篇文章還需要指定一張封面圖的需求,
但有時候某些版面的編排製作上,圖片只能夠顯示正方形的圖,如果使用者在後台上了一張長方形的圖,
而前台只能顯示正方形,所以就會變成……
在後台裡,我們是可以在使用者上傳圖片後對圖檔做檢查,只要不是符合正方形的圖片就擋回去,
但有時候我們工程師這樣的作法卻反而會引起很多使用者的反彈,因為不能較使用者都要會圖片裁剪的能力以及工具,
所以跟使用者拉鋸的情況下,使用者多半都會接納圖片變形的結果,而讓網頁看起來就是充滿變形的圖片。
其實這種情況也是有多種解決的方法,
例如說可以用之前介紹的圖片裁剪功能,讓使用者上傳圖片後,再去裁剪要顯示的範圍,不過就要多花功夫去做這部份的功能,
或者是說,使用者上傳圖片之後,讓程式自動去裁剪要顯示的範圍並另存成新圖檔,這也是個不錯的方式,這以後會講到。
不過比較簡單的方式還是透過前端 Javascript 程式的操作,讓前端的圖片自動顯示一個正方形範圍而且還有縮圖的效果,
接下來我們就來練習做這個功能。
因為有人問起,再加上自己以往沒有做過,所以就來試試看,其實這一題只是將以往的作法給稍微改變就可以了,
以往很多人使用Web Service的方式都是直接在Web專案中加入服務參考,
但是這樣會有幾個問題就是:
如果這個Web Service會在多個專案中去使用到的話,那麼每個專案都要做同樣的動作…
如果使用Web Service還會再去封裝一些方法,每個專案去加入服務參考後還要再去複製貼上已經做好的方法,這種複製貼上不是正確的寫程式方式…
所以接下來就看看這練習題要如何做。
問題:
開始日期:2011/09/28
結束日期:2011/12/31
請取出 "每一個月第4週的星期二" 的日期。
其實這一題是延續「練習題:於指定的日期區間中取出符合指定DayOfWeek的日期」,
看起來好像蠻簡單的,但是這裡頭也碰到了幾個基本的日期操作,例如:
一年有多少週數?
如何自定每週的第一天是星期幾?
指定月份有幾週?
指定月份的第一天是一年之中的第幾週?
指定月份的最後一天是一年之中的第幾週?
指定週數的第一天,其日期為何?
指定週數的最後一天,其日期為何?