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代码中,只对协议的查询字符串构成做了解释,传输方向查询字符串构成是同样原理。

 

posted @ 2013-12-15 11:47  wusir  阅读(2245)  评论(0编辑  收藏  举报