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

  • 相关阅读:
    Codeforces Round #388(div 2)
    Codeforces Round #387(div 2)
    Codeforces Round #386(div 2)
    Codeforces Round #385(div 2)
    Codeforces Round #384(div 2)
    Wannafly Union Goodbye 2016
    写在2016的最后一天——给未来的自己
    2016HDU校赛
    2016BUAA校赛决赛
    codevs 1344 模拟退火
  • 原文地址:https://www.cnblogs.com/wusir/p/3475113.html
Copyright © 2011-2022 走看看