添加一个搜索方法和搜索视图
在本节中,您将添加搜索功能到允许您搜索电影的体裁或名称的Index
操作方法。
更新索引形式
首先,对现有的MoviesController
类更新Index
操作方法。下面是代码︰
public ActionResult Index(string searchString) { var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } return View(movies); }
第一行的Index
方法创建以下的LINQ查询,选择看电影︰
var movies = from m in db.Movies select m;
查询定义了在这一点上,但尚未还没有针对数据库运行。
如果searchString
参数包含一个字符串,修改电影查询要作为筛选依据的值的搜索字符串,使用以下代码︰
if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); }
s => s.Title
上面的代码是一个Lambda 表达式。Lambda 时在方法基于LINQ查询中被用作在哪里法在上面的代码中使用标准查询运算符方法的参数。当它们被定义或修改通过调用等Where
或OrderBy
方法时,不会执行 LINQ 查询。相反,查询执行延迟,这意味着表达式的计算延迟,直到其实现的价值实际上遍历或ToList
方法调用。在Search
示例中,查询是在Index.cshtml视图中执行的。有关延迟的查询执行的详细信息,请参阅执行查询。注︰包含方法运行在数据库上,不是 c# 代码上面。在数据库上,包含映射到SQL 一样,这是区分大小写。
现在,您可以更新将向用户显示窗体的Index
视图。
运行应用程序并导航到/Movies/Index。如追加查询字符串?searchString=ghost
到的 URL。显示已筛选的电影。
如果您更改Index
方法有一个名为id
参数的签名, id
参数将匹配{id}
占位符在App_Start\RouteConfig.cs文件中设置的默认路由。
{controller}/{action}/{id}
原始的Index
方法看起来像这样︰
public ActionResult Index(string searchString) { var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } return View(movies); }
修改后的Index
方法将如下所示︰
public ActionResult Index(string id) { string searchString = id; var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } return View(movies); }
现在,可以将搜索标题作为路由数据 (URL 段) 而不是作为查询字符串值传递。
然而,你不能指望用户修改 URL,每次他们想要寻找一部电影。所以,现在你会添加 UI,以帮助他们筛选电影。如果您更改了要测试如何传递路线绑定 ID 参数的Index
方法的签名,改变它回去,这样你的Index
方法采用一个名为searchString
的字符串参数:
public ActionResult Index(string searchString) { var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } return View(movies); }
打开Views\Movies\Index.cshtml文件,并只是后 @Html.ActionLink("Create New", "Create")
,添加下面突出显示的窗体标记︰
@model IEnumerable<MvcMovie.Models.Movie> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") @using (Html.BeginForm()){ <p> Title: @Html.TextBox("SearchString") <br /> <input type="submit" value="Filter" /></p> } </p>
Html.BeginForm
帮助器创建开放<form>
标记。Html.BeginForm
助手导致窗体发布到本身,当用户提交表单时通过单击筛选器按钮。
视觉工作室 2013年有很好的改善显示和编辑视图文件时。当你打开运行该应用程序的视图文件时,Visual Studio 2013 调用正确的控制器操作方法要显示的视图。
索引视图与在 Visual Studio 中打开 (如上面的图片中所示),点击 Ctr F5 键运行该应用程序,然后尝试寻找一部电影。
那里是Index
方法没有HttpPost
过载。你不需要它,因为该方法不会改变应用程序的状态只筛选数据。
您可以添加以下HttpPost Index
方法。在这种情况下,操作调用程序将匹配HttpPost Index
法和HttpPost Index
方法将运行下面的图像所示。
[HttpPost] public string Index(FormCollection fc, string searchString) { return "<h3> From [HttpPost]Index: " + searchString + "</h3>"; }
然而,即使您添加此HttpPost
版本 Index
方法,还有这一切如何执行的限制。想象一下你想要添加书签特定的搜索或你想要的链接发送给朋友,他们可以单击才能看到的电影相同的筛选的列表。注意,HTTP POST 请求的 URL 是 GET 请求 (localhost:xxxxx/电影/索引) 的 URL 相同 — — 在 URL 本身没有搜索信息。右现在,搜索字符串信息发送到服务器作为窗体字段值。这意味着你永远不能捕捉,搜索信息,以书签或发送给朋友在 URL 中。
解决方法是为使用 BeginForm
,它指定重载 POST 请求应搜索将信息添加到 URL,应该把它传递到Index
方法的HttpGet
版本。用以下标记替换现有的无参数BeginForm
方法︰
@using (Html.BeginForm("Index","Movies",FormMethod.Get))
现在当你提交一个搜索,该 URL 包含一个搜索查询字符串。搜索还会去的 HttpGet Index
操作方法,即使你有一个 HttpPost Index
方法。
添加按种类搜索
如果您添加Index
方法的HttpPost
版本,现在删除它。
接下来,您将添加一个功能,让用户搜索电影按类型排列。Index
法替换为以下代码︰
public ActionResult Index(string movieGenre, string searchString) { var GenreLst = new List<string>(); var GenreQry = from d in db.Movies orderby d.Genre select d.Genre; GenreLst.AddRange(GenreQry.Distinct()); ViewBag.movieGenre = new SelectList(GenreLst); var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } if (!string.IsNullOrEmpty(movieGenre)) { movies = movies.Where(x => x.Genre == movieGenre); } return View(movies); }
这个版本的Index
方法需要一个额外的参数,即movieGenre
。第一次的几行代码创建一个List
对象来保存电影流派从数据库。
下面的代码是从数据库中检索所有流派的 LINQ 查询。
var GenreQry = from d in db.Movies orderby d.Genre select d.Genre;
代码使用泛型 List
集合的 AddRange
方法向列表中添加所有不同的流派。(不带 Distinct
修饰符,将添加重复的流派 — — 例如,喜剧会添加两次在我们的示例)。代码然后在ViewBag.movieGenre
对象中存储流派的列表。作为中ViewBag
此时对象存储类别数据 (这种类型的电影的),然后访问下拉列表框中的类别数据是 MVC 应用程序的典型方法。
下面的代码演示如何检查movieGenre
参数。如果它不是空的代码进一步约束电影查询,以限制所选的电影到指定的体裁。
if (!string.IsNullOrEmpty(movieGenre)) { movies = movies.Where(x => x.Genre == movieGenre); }
如前所述,不运行查询的数据基础上直到电影列表遍历 (这种情况的发生在视图中, Index
操作方法返回后)。
将标记添加到要支持搜索按类型排列的索引视图
添加到Views\Movies\Index.cshtml文件中,只是之前的TextBox
帮手Html.DropDownList
帮手。已完成的标记如下所示︰
@model IEnumerable<MvcMovie.Models.Movie> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") @using (Html.BeginForm("Index", "Movies", FormMethod.Get)) { <p> Genre: @Html.DropDownList("movieGenre", "All") Title: @Html.TextBox("SearchString") <input type="submit" value="Filter" /> </p> } </p> <table class="table">
在下面的代码︰
@Html.DropDownList("movieGenre", "All")
参数"movieGenre"提供DropDownList
helper 在ViewBag
中查找IEnumerable<SelectListItem >
的关键。ViewBag
被填充的操作方法中︰
public ActionResult Index(string movieGenre, string searchString) { var GenreLst = new List<string>(); var GenreQry = from d in db.Movies orderby d.Genre select d.Genre; GenreLst.AddRange(GenreQry.Distinct()); ViewBag.movieGenre = new SelectList(GenreLst); var movies = from m in db.Movies select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } if (!string.IsNullOrEmpty(movieGenre)) { movies = movies.Where(x => x.Genre == movieGenre); } return View(movies); }
"所有"提供被预先选定列表中的项的参数。我们使用下面的代码︰
@Html.DropDownList("movieGenre", "Comedy")
我们在我们的数据库与"喜剧"体裁的电影,"喜剧"会预先选定的下拉列表中。因为我们没有一个电影流派"所有人",还有没有"所有"在SelectList
,所以当我们回来不作出选择的情况下发布, movieGenre
查询字符串值为空。
运行应用程序并浏览到/Movies/Index。按流派、 电影的名称,和这两个条件,请尝试搜索。
在本节中,您创建了搜索操作方法和视图,可以让用户搜索的电影标题和流派。在下一节中,你会看看如何将属性添加到Movie
模型以及如何添加一个初始值设定项,将自动创建一个测试数据库。
-----------------------------------------------------
《ASP.NET MVC 5 入门指南》12篇文章汇总如下:
5. ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB
7. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
8. ASP.NET MVC 5 - 将数据从控制器传递给视图
10. ASP.NET MVC 5 - 给电影表和模型添加新字段
11. ASP.NET MVC 5 - 给数据模型添加校验器
12. ASP.NET MVC 5 - 查询Details和Delete方法
希望这些文章对感兴趣的朋友有所帮助