ASP.NET MVC利用ActionLink实现动态组合查询
一个文件传输数据表,内有日期、传输协议、传输方向(上传或下载)、文件名等信息,完整的表内容显示如下:
现在需要分类查询,即按照协议和传输方向查询。单独的分类查询问题并不大,比如,按协议查询,在View中写出如下的代码:
@Html.ActionLink("Http","index1",new{protocol="Http"})
按传输方向查询,在View中写出如下代码:
@Html.ActionLink("Download","index1",new{direction="Download"})
以上两行代码都是通过QueryString的方式传输参数,产生的链接效果为:/log/index1?protocol=Http 和 /log/index1?direction=Download,后台在Controller的index1方法中解析相应的参数进行查询,就可以了。如下图:
如果现在是把上面的查询实现组合查询,比如查询Http协议中下载(Download)的记录,自然,要使用两个参数:/log/index1?protocol=Http&direction=Download这样的办法,在后台Controller中使用index1方法解析出两个参数完成查询,这样做并不困难。比较困难的是,这种组合查询如何在View中使用ActionLink构成呢?
比如:/log/index1?protocol=Http&direction=Download,可以考虑ActionLink获取Request.Url,然后在Request.Url的基础上,加入新的QueryString来完成,不过要想一下这样的问题:
/log/index1?protocol=Http&direction=Download 的意思是列出Http协议下载的记录,如果在这种结果的情况下,用户点击Upload,说明用户需要查询Http协议中上传的记录,那么,正常的查询字符串应该是这样:
/log/index1?protocol=Http&direction=Upload,
但如果利用ActionLink使用Request.Url后面添加查询字符串的方式完成,则会变成如下的结果:
/log/index1?protocol=Http&direction=Download&direction=Upload
这不是我们想要的构成方式。
解决办法是:在Controller中使用ViewBag记录protocol和direction两个参数的内容,在View中判断这两个参数是否为空,来构成组合查询的QueryString,具体代码为:
Controller中index1方法中的相应代码:
ViewBag.Protocol = Request.QueryString["protocol"]; ViewBag.Direction = Request.QueryString["direction"];
View中index1.cshtml相应代码
@using(Html.BeginForm()){ <fieldset> <legend>查询条件</legend> <p> @Html.ActionLink("All", "index1", "Log") </p> <p> @foreach (string p in ViewBag.ProtocolList) { object objRoute; if (string.IsNullOrEmpty(@ViewBag.Direction)) { //如果传输方向参数为空,只构造协议的查询字符串 objRoute = new { protocol = p }; } else { //如果原来的查询字符串中有传输方向参数,在查询字符串中保留该传输方向参数 objRoute = new { protocol = p, direction = @ViewBag.Direction }; } @Html.ActionLink(p, "index1", objRoute) <text> | </text> } </p> <p> @if(string.IsNullOrEmpty(@ViewBag.Protocol)) { @Html.ActionLink("Download", "index1", new { direction = "Download"}) <text> | </text> @Html.ActionLink("Upload", "index1", new{ direction = "Upload"}) } else { @Html.ActionLink("Download", "index1", new { protocol = @ViewBag.Protocol, direction = "Download"}) <text> | </text> @Html.ActionLink("Upload", "index1", new { protocol = @ViewBag.Protocol, direction = "Upload"}) } </p> </fieldset> }
代码中ViewBag.ProtocolList是在Controller中制作的表中全部协议列表。
从View的代码可以看出,只有当点击“All”链接时,对应的是/log/index1页面,列出全部记录;单独点击协议或者传输方向,可以单独构成一个参数的QueryString,如果组合查询,由于在View中有查询字符串的判断,所以可以构成合理的组合查询字符串。View代码中,只对协议的查询字符串构成做了解释,传输方向查询字符串构成是同样原理。