天天看點

【譯】ASP.NET MVC 5 教程 - 8:搜尋查詢

在本節中,我們為 Index 方法添加查詢功能,使我們能夠根據電影的題材或名稱進行查找。

首先,我們需要更新 MoviesController 的 Index 方法,代碼如下:

Index 方法的第一行代碼建立了一個 LINQ 查詢,用來選擇符合條件的電影:

這個查詢雖然在這裡定義出來,但并沒有在資料庫中執行。

如果 <code>searchString</code> 參數包含一個字元串(不是空字元串),movies 查詢将會添加一個查詢字元串的過濾條件,代碼如下:

代碼清單3中的 <code>s =&gt; s.Title </code>是一個 Lambda 表達式,Lambda 表達式被用在基于方法的LINQ查詢中(上面代碼中的 Where 方法),當做參數來使用。LINQ 語句在定義或修改的時候不會執行,相反的,查詢會延遲執行,這意味着一個指派語句直到疊代完成或調用 ToList 方法才具備真正的值。在上面的示例中,查詢語句在 Index.cshtml 視圖中執行。

現在,你可以修改Index 視圖,讓他展示一個表單給使用者輸入。

運作應用程式,并導航到 /Movies/Index ,在URL後面添加一個查詢,例如 <code>?searchString=中國</code>,被過濾的電影内容如下:

如果你把 Index 方法的參數名改為 id,那麼 id 參數将會比對 App_Start\RouteConfig.cs 檔案中的預設路由中的<code>{id}</code> 。

修改後的Index方法如下:

修改以後,我們可以通過路由資料來傳遞查詢字元串:

然而,你不能指望使用者每次都通過修改URL來查找電影,是以你需要在界面上幫助他們過濾資料。如果你剛剛使用代碼清單4中的代碼測試了路由綁定是如何傳遞ID參數,現在再把它改回來,原始的代碼可參考代碼清單1。

打開Views\Movies\Index.cshtml  檔案,在<code>@Html.ActionLink("Create New", "Create") </code>後面添加如下代碼:

<code>Html.BeginForm</code> 幫助方法建立一個 <code>&lt;form&gt;</code>  标簽。通過單擊“Filter”按鈕将表單送出給目前的頁面。

運作應用程式,然後試着查找一個電影:

我們沒有為 Index 方法定義 HttpPost 的重載,因為我們根本沒有修改資料,隻是做了一個查詢。

我們可以為 Index 方法添加 HttpPost 的重載,這樣一來,程式将會調用 HttpPost 修飾的 Index 方法,相應的代碼和截圖如下:

然而,盡管我們添加了HttpPost版的Index方法,它在實作的時候仍然存在一些局限性。設想你想将一個比較詳細的查詢添加書簽,或者你想将查詢結果以連結形式發送給朋友,注意觀察HTTP POST 請求的時候,URL是沒有改變的(仍然是 localhost:xxxxx/Movies/Index),這個位址本身不包含查詢資訊。現在,查詢資訊是作為表單資料發送到伺服器的,這意味着你不能抓取到URL中的查詢資訊,将URL作為書簽或發送給朋友。

解決方案就是重寫 BeginForm 語句,使它發送一個GET請求,進而調用HttpGet版本的Index方法,修改後的代碼如下:

現在你再點選“Filter”按鈕進行查找,查找的參數将包含在URL中,然後調用HttpGet 版的 Index 方法:

删掉之前代碼中添加的 HttpPost 版的 Index方法,以後我們不再用到了。

然後,我們修改 Index 方法的代碼,使它能夠根據題材進行查詢。修改後的代碼如下:

在修改完控制器之後,我們還需要在Index視圖中添加一個字段。在我們之前的名字查詢之前,使用 <code>Html.DropDownList</code> 添加一個下拉框,修改後的代碼如下:

代碼 @Html.DropDownList("movieGenre", "All") 生成一個下拉清單,參數 movieGenre 指明要查找的ViewBag 中的資料集合的名稱,我們在代碼8中做了标記;參數 all 是預選中的資料,我們可以使用“Comedy”替換。

運作應用程式,試着根據題材和标題查詢一下:

在本節中,我們建立了查詢的方法和視圖,使使用者可以根據電影的标題和題材進行查詢。在下一節中,我們将結束如何為Movie 模型添加屬性,以及如何添加一個自動建立測試資料庫的初始值。