一、简介&目标:
这一节中,学习添加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模型模块中添加验证