今天终于又回到了 MVC5学习系列,这一篇我们继续学习——添加查询。
首先我们先修改一下Movies控制器中Index方法的代码:
<span style="font-size:18px;"> public ActionResult Index(string searchMovieTitle)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchMovieTitle))
{
movies = movies.Where(s => s.Title.Contains(searchMovieTitle));
}
return View(movies);
}</span>
地址栏中我们可以这样访问:http://192.168.1.105/?searchMovieTitle=1或者http://192.168.1.105/movies/Index?searchMovieTitle=1 查询结果:只有“速度与激情1”一条记录。
下面我们修改一下试图页面——添加查询输入框:
<span style="white-space:pre"> </span><span style="font-size:18px;"><p>
@Html.ActionLink("添加电影", "Create")
</p>
@using (Html.BeginForm())
{
<p>
电影名称: @Html.TextBox("searchMovieTitle")
<input type="submit" value="查询" />
</p>
} </span>
我们看一下生成的HTML代码:
表单默认是“POST”方法,现在我们在输入框中输入“1”,点击【查询】:
我也是晕了,GET、POST都行啊!下面我们处理一下代码,Index方法上添加“[HttpPost]”属性,并还原之前Index方法,相当于重载了。之后我们在此调试,哈哈,现在你在地址栏中再次输入http://192.168.1.105/movies/Index?searchMovieTitle=1 就查询不到了,因为我们添加了[HttpPost]属性,包含查询的Index方法只支持POST。不知道你有没有发现在生成的HTML代码中form表单是这样的
<form action="/" method="post">
我不太喜欢这种默认的情况,这里我们具体指明是哪个控制器中的哪个方法,并且修改Form表单的样式:
<span style="white-space:pre"> </span>@using (Html.BeginForm("Index","Movies",FormMethod.Post,new { @class = "form-inline" }))
{
<p>
电影名称: @Html.TextBox("searchMovieTitle", "", new { @class = "form-control", @placeholder = "请输入电影名称" })
<input type="submit" value="查询" class="btn btn-default"/>
</p>
}
现在我们在包含查询的Index方法上再添加一个属性“[ValidateAntiForgeryToken]”,这时候你在点击查询就会失败了,如下图:
现在我们在视图页面的Form表单中添加@Html.AntiForgeryToken() 然后刷新页面,就可以了。成功!
下面我们再添加一个搜索类型——电影体裁。我们现在视图页面上添加:
<span style="white-space:pre"> </span>@using (Html.BeginForm("Index", "Movies", FormMethod.Post, new { @class = "form-inline" }))
{
@Html.AntiForgeryToken()
<p>
电影名称: @Html.TextBox("searchMovieTitle", "", new { @class = "form-control", @placeholder = "请输入电影名称" })
体裁: @Html.DropDownList("movieGenre", null, "请选择体裁",new { @class = "form-control" })
<input type="submit" value="查询" class="btn btn-default"/>
</p>
}
现在我们修改后台代码:
<span style="white-space:pre"> </span>// GET: Movies
public ActionResult Index()
{
LoadDropMovieGenre();
return View(db.Movies.ToList());
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string searchMovieTitle,string movieGenre)
{
LoadDropMovieGenre();
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchMovieTitle))
{
movies = movies.Where(s => s.Title.Contains(searchMovieTitle));
}
if (!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
private void LoadDropMovieGenre()
{
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);
ViewData["movieGenre"] = new SelectList(GenreLst);
}
因为在页面加载时就要填充下拉框,所以我们在GET的Index方法中同样添加LoadDropMovieGenre()方法。下面我们刷新一下页面:
下面你就可以随便组合查询了。经测试没有问题!这里还要说明一下的是ViewBag.movieGenre = new SelectList(GenreLst);和ViewData["movieGenre"] = new SelectList(GenreLst); 都可以绑定下拉框。
上面我们说的都是POST,下面我们试一下GET,将后台的代码修改一下:
<span style="white-space:pre"> </span>// GET: Movies
public ActionResult Index(string searchMovieTitle, string movieGenre)
{
//LoadDropMovieGenre();
//return View(db.Movies.ToList());
LoadDropMovieGenre();
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchMovieTitle))
{
movies = movies.Where(s => s.Title.Contains(searchMovieTitle));
}
if (!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
将POST的index方法屏蔽掉,将视图中表单的method改为GET、还有就是将@Html.AntiForgeryToken()去掉,然后重新生成解决方案,刷新页面:
这里测试也没有问题。这里说一下视图中的代码,其中form表单是这样写的Html.BeginForm(),其实你也可以写HTML代码:
<span style="white-space:pre"> </span><form class="form-inline" action="/Movies/Index" method="get">
<div class="form-group">
<label for="searchMovieTitle">电影名称</label>
<input type="text" class="form-control" name="searchMovieTitle" id="searchMovieTitle" placeholder="电影名称">
</div>
<div class="form-group">
<label for="movieGenre">体裁</label>
<select name="movieGenre" class="form-control" id="movieGenre">
<option value="" selected="selected">请选择体裁</option>
@foreach (var item in (List<string>)ViewData["movieGenre"])
{
<option>@item</option>
}
</select>
</div>
<button type="submit" class="btn btn-default">查询</button>
</form>
<p></p>
效果是一样的!只不过要遍历绑定体裁下拉框,还有就是将ViewData["movieGenre"] = new SelectList(GenreLst);换成ViewData["movieGenre"] = GenreLst;就可以了。这篇就写到这里了,谢谢!