勇敢者论坛源代码分析系列(2)—url参数传递

来源:互联网 发布:php抓取新闻 编辑:程序博客网 时间:2024/04/30 00:59
    前言:勇敢者论坛是一个开放源码的ASP.NET c#论坛,使用VS.NET 2005开发管理,可以支持两种数据库 SQL2000或Accsee。作者的开发本意,就是提供给大家学习使用的。写本系列代码分析,也是为了初学者更快的入门和进步。祝大家学习愉快!多多指教。

    勇敢者论坛: 程序演示 源码下载

    上一节讲的是简单的数据查询,这节本来想讨论一下分页查询,不过看看论坛上使用的分页方法中有关url参数传递的使用,就先说说怎么用url传递参数吧。
    以勇敢者论坛(开放源码的ASP.NET论坛) 的 left.aspx(就是左边的树形目录)和BigcalssList.aspx?BID=XXX(大分类列表) 这两个页面为例子,看看是怎么把帖子列表显示出来的,再顺便看看Mainlist.aspx(各个分类的帖子列表),怎么处理多个参数。
    在left.aspx中,我们看到了<uc1:Menus id="Menus1" runat="server"></uc1:Menus>,实际显示树中分类内容的部分都在这个用户控件中,就是Menus.ascx,在这个文件中,我们可以看到一个<%=text%>,其上边的那个table,是一些固定的栏目,这个text,在Menus.ascx.cs代码中,具体的付值,最终拼出了我们所看到的树形结构。

  protected void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   text=MenuLoad();
  }

  private string MenuLoad()
  {
   //填充树干的内容
   string trees="",bs="";
   int i=1;
   BT=DBOperate.SelectFormForum("SELECT BigClass_ID, BigClass_Name, Enable FROM Big_Class WHERE (Enable = 1)");
   ST=DBOperate.SelectFormForum("SELECT SmallClass_ID, BigClass_ID, SmallClass_Name, Enable FROM Small_Class WHERE (Enable = 1)");
   DataRow [] drs = BT.Select("");

   foreach( DataRow r in drs )
   {
    trees+="<table border=0 cellpadding=0 cellspacing=0><TR height=2><td></td></tr></table><table width=158 border=0 align='center' cellpadding=0 cellspacing=0 bgcolor=#FFFFFF><TBODY>";
    bs="<A href="+"BigcalssList.aspx?BID="+r["bigclass_ID"].ToString()+" target='mainFrame'>"+r["bigclass_Name"].ToString()+"</A>";
                trees += "<tr><td height=25 background='image/menudown.gif' id='imgmenu" + i + "' style='CURSOR: hand' onclick='showsubmenu(" + i + ")' class='Top11'>&nbsp;&nbsp;<SPAN>" + bs + "</SPAN></td></tr> <tr><td id='submenu" + i + "' style='DISPLAY: none'><DIV align='center'><table width='90%' cellpadding=0 cellspacing=3><TBODY>";
    string parentid=r["bigclass_ID"].ToString();
    trees+=CreateNode(parentid)+"</TBODY></table></DIV></td></tr></TBODY></table>";
    i++;
   }
   return trees;
  } 

  private string CreateNode(string parentid)
  {
   //填充树枝的内容
   string Nodes="";
   DataRow [] drsr = ST.Select("BigClass_ID = "+parentid);
   foreach( DataRow rw in drsr )
   {
    Nodes=Nodes+"<tr><td><font color=#ff0000>·</font><A href="+"Mainlist.aspx"+"?solved=0&BID="+ rw["bigclass_ID"].ToString() +"&SID="+ rw["SmallClass_ID"].ToString()+"&Page=1 target='mainFrame'>"+rw["SmallClass_Name"].ToString()+"</A></td></tr>";
   }   
   return Nodes;
  }

----------------

    这里,要想更直观的看到结果,不如在运行程序以后,在default2.aspx的左边,也就是树形所在的leftFrame中,找个空地方,鼠标右键-〉查看源文件,在这里可以看到最终的输出结果。

    在上边代码中,可以找到这么一句:bs="<A href="+"BigcalssList.aspx?BID="+r["bigclass_ID"].ToString()+" target='mainFrame'>"+r["bigclass_Name"].ToString()+"</A>";这句,就是为了调用BigcalssList.aspx的后边的?BID=就是要传递的大分类id,r["bigclass_ID"]会根据数据库中不同的数据,给BID提供具体的编号。

     树枝中调用 Nodes=Nodes+"<tr><td><font color=#ff0000>·</font><A href="+"Mainlist.aspx"+"?solved=0&BID="+ rw["bigclass_ID"].ToString() +"&SID="+ rw["SmallClass_ID"].ToString()+"&Page=1 target='mainFrame'>"+rw["SmallClass_Name"].ToString()+"</A></td></tr>"; 拼成调用Mainlist.aspx的地址串。

    运行论坛,当鼠标划过树形的大分类,比如大众社区,IE状态栏上会显示.../BigcalssList.aspx?BID=1,小分类上,则显示:.../Mainlist.aspx?solved=0&BID=1&SID=210&Page=1,这里我们可以比较出来,传递参数,无非就是把具体的页面地址后面加上“?参数名1=参数值1“,而多个参数之间只需要用&隔开。

    那么如何接收参数呢?打开 BigcalssList.aspx.cs,Request.QueryString["BID"]就是读取传过来的 BID参数的语句。Mainlist.aspx.cs 也一样,Request.QueryString["BID"],Request.QueryString["SID"],Request.QueryString["solved"]等,就是读取参数的语句了,读取以后,按自己的需要进行处理就可以了。

    先就说这些把,自己做做测试把。

--------------------------------------------------------------

有什么不明确的,可以提出来讨论。高手和有写作经验的朋友,欢迎指点!