在上一篇介紹完了搜索功能的概念和思路之後,在這一篇開始要看實作的部份。
通常寫Mvc都是從Model開始,因此這一篇將來看一下搜索功能所會使用到的ViewModel
ViewModel的內容
首先,搜索的ViewModel必然會有兩個Property:
- 搜索條件
- 搜索結果
因此,我們會先從這兩個部份的Property來看起。
搜索條件的ViewModel
搜索條件會有一定有的欄位和各個domain所需要的欄位,因此會先定義一個Base,好方便之後domain來繼承並且提供其他相關欄位。
一定會有的欄位像是:
- 每頁筆數
- 目前頁數
- 排序欄位
- 排序順序
Domain相關的欄位就依照各自的需求,例如假設是一篇文章,可能會有以“標題”做搜索或者以“內文”做搜索。
因此,程式碼會如下:
這個ViewModel實作的Interface就不看了,基本上就是這些Property的定義。
這邊有個地方可以注意到就是排序的欄位。因為我們這個SearchFormViewModelBase
沒有形態的概念,而通常來說搜索條件會和某一個DB的Table對應。因此,為了方便之後框架幫忙做搜索,這邊又定義一個有強型別的SearchFormViewModelBase
:
可以注意到這個Class的定義是
Abstract
,表示之後的class應該要依照自己的Domain去做繼承,例如如果今天是Post的搜索ViewModel,希望有一個 “標題”的搜索欄位,和排序要以“建立時間”欄位,那麼ViewModel就會是: 搜索結果
這個部份就比較簡單,就是某一個和Detail頁面一樣ViewModel不過是被一個IPagedList
包住。因此他不會像搜索ViewModel一樣有個base而是直接看定義的 ViewModel然後以泛型的方式傳入。
PagedList.Mvc - 好用的分頁套件
- Nuget安裝指令:Install-Package PagedList.Mvc
- 套件Github首頁:https://github.com/TroyGoode/PagedList
- 如果完全沒有用過,可以參考:
搜索ViewModel的主檔
有了這兩個Property的ViewModel之後,就可以建立搜索的ViewModel的Base:
Post的搜索ViewModel
定義好了搜索的BaseViewModel之後,假設今天是Post
頁面要做搜索的ViewModel,就可能會像是:
結語
有了搜索的ViewModel之後,在下一篇將會介紹框架的Service怎麼能夠做修改並且讓搜索處理邏輯變的簡單。