MVC5学习系列—添加查询

      今天终于又回到了 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;就可以了。这篇就写到这里了,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值