当前位置 > 首页 > Asp.net

Asp.Net MVC4入门指南 官方教程本土化之七--增加搜索方法和视图

2012-12-6 14:27:00来源:Asp.net

译者注:本节内容实际上是原英文教程第六节的后半部分,因感觉跟第六节内容较长,本部分内容与上节标题(添加编辑方法和视图)无关,在项目开发中搜索功能既常见又常用,在此拿出来作为单独章节。

本节课程中,你将添加一个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表单。以下为视图文件:

@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。现在你可以传递搜索名称作为路由数据替代查询字符串方式,即采用以下