Asp.Net MVC4.0 官方教程 入門指南之七--增加搜索方法和視圖


譯者注:本節內容實際上是原英文教程第六節的后半部分,因感覺第六節內容較長,本部分內容與上節標題(添加Edit方法和視圖)無關,在項目開發中搜索功能既常見又常用,在此拿出來作為單獨章節。

本節課程中,你將添加一個SearchIndex 方法,使你可以通過片名來搜索影片。 /Movies/SearchIndex地址將可用。該請求將顯示一個包含用戶可以輸入的input元素的表單來查找影片。當用戶提交表單后,該方法將得到用戶提交的搜索值並用於搜索數據庫。

首先在現有的MoviesController類中增加一個SearchIndex方法。該方法將返回包含Html表單的視圖。以下為代碼:

        public ActionResult SearchIndex(string searchValue)
        {
            //linq方式,查詢所有影片,僅定義,不執行
            var movies = from m in db.Movies 
                         select m;
            if (string.IsNullOrEmpty(searchValue) == false)
            {
                //基於linq查詢結果的Lambda表達式,調用where方法后執行linq
                movies = movies.Where(m => m.Name.Contains(searchValue));                
            }
            return View(movies);
        }

查詢操作是延遲執行的,意味着表達式的值運算直到值被遍歷或者調用ToList方法才會被執行。在這個例子中,查詢是在SearchIndex視圖中執行的。想了解更多關於查詢延遲執行方面的信息,請參見Query Execution

現在你可以實現 SearchIndex視圖,由它來呈現用戶表單。在SearchIndex方法內部右鍵單擊,選擇添加視圖。在對話框中,勾選“創建強類型視圖”,然后指定你將傳遞Movie對象給視圖模板作為它的模型類。在支架模板列表中,選擇List后點擊添加,如下圖所示

點擊添加按鈕后,視圖模板Views\Movies\SearchIndex.cshtml將被創建。因為你選擇了支架模板中的List,Visual Studio在視圖中自動生成一些默認標記。支架系統查看Movie類並為其每個屬性創建了<Label>屬性元素,形成HTML表單。以下為視圖文件:

View Code
@model IEnumerable<MvcMovie.Models.Movie>

@{
    ViewBag.Title = "SearchIndex";
}

<h2>SearchIndex</h2>

<p>
    @Html.ActionLink("Create New", "Create")   
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genra)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Date)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genra)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Date)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}
</table>

運行程序,導航到/Movies/SearchIndex.,在地址后附加一個類似“?searchValue=少年”的查詢字符串,會將過濾后的結果顯示出來。

如果你改變SearchIndex 方法的簽名,使參數標識符為ID,則參數ID將與在Global.asax文件中設置的默認路由匹配{controller}/{action}/{id},即把SearchIndex的形參 searchValue修改為ID。現在你可以傳遞搜索名稱作為路由數據替代查詢字符串方式,即采用以下方式訪問http://localhost:5279/Movies/SearchIndex/少年。

然而,你不能期望用戶為了搜索影片而每次去修改url。因此,添加交互界面(UI)來幫助他們過濾影片。如果你上文中對SearchIndex的方法簽名進行了修改,用來測試通過路由綁定方式來傳遞ID參數,那么改回來,即方法擁有一個名稱為searchValue的字符串類型參數。

打開Views\Movies\SearchIndex.cshtml文件,在@Html.ActionLink("Create New", "Create")代碼后添加如下代碼

@using (Html.BeginForm()){ 
<p> 片名: @Html.TextBox("searchValue")<br /> 
<input type="submit" value="查詢" /></p> 
}

Html.BeginForm方法將創建<form>標記。用戶通過點擊“查詢”按鈕提交表單。運行程序並嘗試查詢影片。

實際並沒有標記為HttpPost屬性的SearchIndex的方法。因為該方法並沒有修改應用的狀態,僅僅是過濾數據,因此不需要HttpPost屬性的重載方法。

譯者注:此處有個問題想不通。按上文所述,默認的SearchIndex方法屬性是HttpGet,在視圖中使用Html.BeginForm(),運行程序后,查看頁面源代碼,發現默認是<form action="/Movies/SearchIndex" method="post">,也即用戶點擊按鈕后,是通過post方式把表單傳遞過來的,為啥會調用上面接受HttpGet方式的SearchIndex方法?難道是優先找HttpPost屬性,找不到的情況下提交給HttpGet處理?這是Http協議機制還是MVC機制處理的結果?

你可以添加下面的HttpPost屬性的SearchIndex 方法。在這種情況下,方法調用將匹配HttpPost方式,下面的方法將被執行。

        [HttpPost]
        public string SearchIndex(FormCollection frm, string searchValue)
        {
            return "<h3> 表單HttpPost方式搜索 : " + searchValue + "</h3>"; 
        }

但是,即使你添加了SearchIndex的HttpPost版本的方法,使用的時候仍然存在限制。試想一下,你要得到一個特定的搜索書簽,或者你想發送一個鏈接給朋友,他們可以通過點擊看到與你相同的過濾后的電影列表。注意post請求的url和get請求的url完全相同,在地址欄沒有搜索信息。搜索的文本信息作為表單域值送到服務器。因此你不能獲取包含搜索信息的書簽或者發給朋友一個鏈接。

解決方式就是使用BeginForm的重載方法,指明post請求添加搜索信息到url地址,並路由到HttpGet版本的SearchIndex 方法。使用以下代碼替換已存在的BeginForm 方法
@using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))

現在當你提交搜索時,url將包含查詢字符串。即使存在HttpPost屬性的SearchIndex方法,搜索工作也將由HttpGet屬性的SearchIndex方法處理。


譯者注:以上為原文翻譯的結果。譯者感覺存在邏輯矛盾的地方。使用Html.BeginForm的重載方法,指定了FormMethod.Get參數,也即是將表單的提交方式由默認的post方式變更為Get,自然就會去調用HttpGet屬性的SearchIndex方法。

譯者注:原文進一步舉了一個使用影片風格下拉列表作為查詢條件的例子,與上大都相同,僅細節稍微有所差異,做刪節處理,感興趣的可查看原文。

在本節中,你創建了搜索方法和視圖,讓用戶可以通過影片名稱搜索數據庫。在下節中,你將學習如何給Movie模型添加一個屬性,以及如何添加一個初始化器,用來自動創建測試數據庫。

 


本教程所有文章導航

本系列共10篇文章,翻譯自Asp.Net MVC4 官方教程,由於本系列文章言簡意賅,篇幅適中,從一個示例開始講解,全文最終完成了一個管理影片的小系統,非常適合新手入門Asp.Net MVC4,並由此開始開發工作。

原文供9篇文章,譯者將其中第6篇拆成了2篇

1. Asp.Net MVC4 入門介紹

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/03/2800210.html

2. 添加一個控制器

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801949.html

3. 添加一個視圖

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801988.html

4. 添加一個模型

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803012.html

5. 從控制器訪問數據模型

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803429.html

6.查看Edit方法和Edit視圖

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2804100.html

       http://www.cnblogs.com/seawaving/archive/2012/12/06/2804590.html

7. 為Movie模型和庫表添加字段

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2805401.html

8. 為模型添加驗證

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2806322.html

9. 查看Detail和Delete方法

· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods

· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/10/2811064.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM