接着上次的篇幅,我們這篇手動來寫一個查詢的流程代碼!
搜索/查詢 流程功能的實現
那現在要做搜索(查詢)功能我們第一步應該做什么呢!第一次是不是我們應該去Controller(控制器)里去搞一個搜索(查詢)的方法(action),那么我就說做搜索功能吧!搜索可能是根據名字搜索,如果根據某一個條件搜索的話,那么我們的方法就需要一個參數,如果是多個條件的話就需要多個參數給方法傳遞多個參數,這么說你的方法的參數多少是不是就取決你我們的搜索條件。我們開始就先做一個簡單的單條件查詢。
我們把這個搜索的功能做到MoiveController里的Index方法(action)里,具體做法如下:
這里的查詢語法用的是Linq的寫法,里面也含有簡單的Lambda表達式,當然這種寫法在MVC的Controller具體的Action方法上是很常見的,對於Linq不太熟悉的可以去園子上找一些資料看看。
寫完這個Index方法后,這個時候這個Index方法已經具有搜索功能了,我們運行起來看看:
因為我們知道它的默認的路由機制是{controller}/{action}/{id}.....,那么我們現在來模擬HTTP來拼下,這里主要是為了驗證我們寫的搜索方法看看是不是有效,那么我們現在就模擬HTTP拼寫一個請求去訪問我們的搜索方法,具體操作如下:
模擬請求完結果還是不動,這里不是本人的粗心而是有意寫錯的,如果你細心的話,你會發現上面改的Action在返回的時候是存在問題的,這個一般也是新手最容易犯錯的地方,首先方法里我們都根據參數去查了一遍所以返回的應該是我們查詢的結果,而不是EF的強類型的ToList()集合,所以在這里要多多留心。那么我們修改上面的方法如下:
改完之后我們在重復上面的模擬HTTP請求的操作,在來看看結果:
這樣是不是OK的啦,現在我們的搜索方法是寫好了,但是我們總不能是搜索都要去地址欄去拼參數來完成這個操作,這樣做是不是就有點太嚇了,所以我們要在我們的Index.cshtml頁面上添加一個搜索框供用戶輸入這樣是不是就有好多了,下來我們就來做這么一件事,修改index.cshtml代碼如下:
Html.BeginFrom也是一個在MVC應用程序常用的屬性,它可以以提交From表達類似的動作把當前的From數據以特定的方式提交到對應的Controller(控制器)的方法(Action),與ActionLink一樣它也有三個參數,只不過BeginFrom的參數取更加明了,首先第一個參數是說你要提交給那個動作(action)/方法,所以這里你就給一個處理或者說接受的方法名;第二參數是說你要提交到哪里去,說白了你是要交個那個Controller(控制器)來負責,所以這里你要給一個Controller控制器的名字,第三個則是選擇你要提交的方式。
言歸正傳,在Index.cshtml添加完這個東西,我們運行起來再看看我們的首頁:
這樣的界面相當起來是不是就友好多了。
因為我們MovieController里的Index方法你沒有去指定去接受POST的請求還是GET的請求,所以們現在手動寫一個接受POST請求的方法,看看POST請求過來都有什么動作,在MovieController添加一個下面的方法,方法如下:
然后我們在運行起來看看執行的結果,如下圖:
當然實際應用程序的邏輯可能要比這個復雜百倍所以這個要根據情況而定了,這個時候要是想讓你的請求結果在Index的列表頁面出現的話,其實也很簡單,只需要把Index.cshtml我們剛才寫的BeginForm的FormMethod.Post改成FormMethod.Get即可,如下所示:
改完然后運行程序,效果入下:
那現在我的搜索條件要是在稍微復雜一點的話,比如說我要加根據Genre(音樂類型)和Title(音樂名稱)一起搜索,並且音樂類型是一個可以選擇的而不是我手動去輸入的,這個時候比較起剛才的單條件查詢就要稍微復雜一點了,首先必須動態讀出數據庫里所有的音樂類型然后以下拉列表的形式供用戶選擇,只要做到這一點,那我們的目標就完成90%,好有了需求那么就去搞這么一件事情,為了下拉效果明顯,我在數據庫里添加一些測試數據,數據如下:
添加完數據,我們現在就是想辦法把這個數據讀出來然后動態的綁定到頁面即可,那我們該怎么做呢!我們只要音樂類型的話用什么方式來存查詢的結果比較合適,應該是數組吧!那么我們用數組來存讀出來的音樂類型數據,具體操作如下:
添加一個參數,然后把查詢所有的音樂類型放到集合里通過動態字典接受在頁面綁定,查詢/搜索的時候傳遞音樂類型進來不為空的話去數據庫匹配一下,找數據到就返回,說的可能不是很嚴謹,不過實際上干的事情就是這么多。完了我們看看頁面這么綁定這個動態字典,變成我們預期的下拉框呢!頁面修改如下:
這里的DropDownList第一個參數就是接受返回窗體的名字,這時我們把動態字典給他他會自己解析,第二參數是顯示的默認值這個值我們可以隨便給也可以為null,編輯完頁面,我們在運行起來看看效果:
這樣是不是就達到預期的效果,隨便查詢一個結果看看能不能查詢到結果:
OK,效果實現了如果更多的參數做法還是一樣的,我們的搜索就先做到這里,后續的話我們給Model添加屬性,因為我們的數據庫是EF根據Model映射出來了,所以在實際應用中有些情況下Model會有一些小小的改動,那如果是通過EF code frist映射的數據庫的話,我們添加屬性會引發那些常見的問題呢!后面我們繼續學習,關於搜索我們就先學習到這里。
