[.NET MVC4 入门系列05]添加自定义查询页Search

一、简介&目标:

这一节中,学习添加Search方法和Search视图.

方法名:SearchIndex

视图路径:/Movies/SearchIndex

功能:用户可以通过关键字查找自己感兴趣的电影

提供两种查询条件:电影名关键字、电影种类,如图

http://localhost:54782/Movies/SearchIndex?movieGenre=%E9%AD%94%E5%B9%BB&SearchString=2

这个是查询时,生成的的URL,GET方式,包含QueryString作为查询条件:“?movieGenre=%E9%AD%94%E5%B9%BB&SearchString=2”

 

二、添加控制器Action方法:

查询Search不需要对数据进行更改,所以Action方法只需要使用Get方式即可,所以,在Movie的Controller代码中,添加下面方法:

 1         //
 2         //GET: /Movies/SearchIndex
 3         public ActionResult SearchIndex(string movieGenre,string searchString)
 4         {
 5             //准备种类列表数据源GereLst
 6             var GenreLst = new List<string>();
 7             var GenreQry = from d in db.Movies
 8                            orderby d.Genre
 9                            select d.Genre;
10             GenreLst.AddRange(GenreQry.Distinct());
11 
12             ViewBag.movieGenre = new SelectList(GenreLst);
13 
14             var movies = from m in db.Movies
15                          select m;
16             if (!String.IsNullOrEmpty(searchString))
17             {
18                 movies = movies.Where(s => s.Title.Contains(searchString));
19             }
20 
21             if (string.IsNullOrEmpty(movieGenre))
22             {
23                 return View(movies);
24             }
25             else
26             { 
27                 return View(movies.Where(x=>x.Genre==movieGenre));
28             }
29 
30             return View(movies);
31         }

【代码解析】

  1.方法前面没有[HttpPost]所以,是Get方式向服务器传值,值应该包含在URL的QueryString中,对应方法的两个参数:

    string movieGenre(电影种类),string searchString(电影名关键字);

  2. GenreLst,用来填充查询条件中的电影种类下拉列表,查处后,通过ViewBag.movieGenre传递给View;

  3. movies最多可能会有三次赋值:

  •  第一次赋值获取到所有电影,这个赋值必定执行;
  •  第二次赋值条件是电影名关键字不为空,赋值后获取到电影命中包含指定关键字电影信息;
  •  第三次赋值条件是指定电影种类,赋值后获取到指定电影类型的电影信息。

      4. 最终,返回到符合查询条件的电影查询视图。

三、添加View

  新建视图到/movies/views/中,配置如图:

  

       更改View中代码:

 1 @model IEnumerable<MvcApplication1.Models.Movie>
 2 
 3 @{
 4     ViewBag.Title = "SearchIndex";
 5 }
 6 
 7 <h2>SearchIndex</h2>
 8 
 9 <p>
10     @Html.ActionLink("Create New", "Create")
11     @using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))
12     { 
13         <p>
14             Genre:@Html.DropDownList("movieGenre", "All")
15             Title:@Html.TextBox("SearchString")<br />
16             <input type="submit" value="Filter" />
17         </p>
18     }
19 </p>
20 <table>
21     <tr>
22         <th>
23             @Html.DisplayNameFor(model => model.Title)
24         </th>
25         <th>
26             @Html.DisplayNameFor(model => model.ReleaseDate)
27         </th>
28         <th>
29             @Html.DisplayNameFor(model => model.Genre)
30         </th>
31         <th>
32             @Html.DisplayNameFor(model => model.Price)
33         </th>
34         <th></th>
35     </tr>
36 
37 @foreach (var item in Model) {
38     <tr>
39         <td>
40             @Html.DisplayFor(modelItem => item.Title)
41         </td>
42         <td>
43             @Html.DisplayFor(modelItem => item.ReleaseDate)
44         </td>
45         <td>
46             @Html.DisplayFor(modelItem => item.Genre)
47         </td>
48         <td>
49             @Html.DisplayFor(modelItem => item.Price)
50         </td>
51         <td>
52             @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
53             @Html.ActionLink("Details", "Details", new { id=item.ID }) |
54             @Html.ActionLink("Delete", "Delete", new { id=item.ID })
55         </td>
56     </tr>
57 }
58 
59 </table>

  【代码解析】

  核心代码:

1  @using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))
2     { 
3         <p>
4             Genre:@Html.DropDownList("movieGenre", "All")
5             Title:@Html.TextBox("SearchString")<br />
6             <input type="submit" value="Filter" />
7         </p>
8     }

  1.Html.BeginForm("SearchIndex","Movies",FormMethod.Get)

  HtmlHelper的BeginForm方法,用来按指定的方式向服务器提交信息,并开始Form表单。

  包含三个参数:

    第一个:“SearchIndex”,控制器中指定的Action方法;

    第二个:“Movies”,控制器名称;

    第三个:FormMethod.Get,向服务器提交信息的方式,Get方式

  2.Form表单中包含的就是那个<p>,其中包含三部分:

   1)电影类型下拉列表:Genre:@Html.DropDownList("movieGenre", "All")

     通过movieGenre(Controller的Action方法中通过ViewBag赋值)填充,默认项显示:All

   2)文本框,用来获取电影名称关键字:Title:@Html.TextBox("SearchString")

   3)提交按钮

  3.下面的table是在创建视图时,选定的List模板自动生成的,其中的绑定项是选择强类型Movie类自动指定的。

 

四:扩展阅读:

    Lambda表达式:s=>s.Title,本文中,使用在Linq查询的方法中,充当参数:

   movies = movies.Where(s => s.Title.Contains(searchString));

  此查询对应的Sql语句为:

select * from movie where title like '%'+@searchString+'%'

 


 

初学MS 的MVC 4,参照微软www.asp.net/mvc 中的入门项目,写个MVC 4的入门系列,以供复习和分享。

微软入门项目:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

【目录】

1.[.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序

2.  [.NET MVC4 入门系列02]MVC Movie 为项目添加Model

3.  [.NET MVC4 入门系列03]使用Controller访问Model中数据

4.  [.NET MVC4 入门系列04]Controller和View间交互原理

5. .NET MVC4 入门系列05]添加自定义查询页Search

6. [.NET MVC4 入门系列06] 在Movie Model和表中添加新字段(Code First Migrations)

7. [.NET MVC4 入门系列07] 在Model模型模块中添加验证

  

 

  

posted @ 2013-05-14 11:39  chutianshu_1981  阅读(4699)  评论(1编辑  收藏  举报