返回页面的处理方式

    开发网站后台管理时,经常遇到页面返回的情况,如果采用history.go(-1)的方式返回上一页面,则有时在页面回发之后会停留在当前页面,需要点击多次;如果用ReturnUrl参数,则感觉使用场合不是很合适,而且需要在每个连接上面都指定ReturnUrl参数,虽然可以用Request.Url.PathAndQuery来获取当前页面的完整链接,但实现起来较为繁琐;我在参考了vs2005ASP.NET网站配置的代码之后,发现它是返回上一页的方式是使用Stack的方式来处理,即后进先出的方式;这样我整理了一下,发现通过这种方式来处理返回的应用很便捷。

    这里主要解决两个问题:一个是视图控制,即要显示那个视图(上一视图会自动隐藏)和返回上一视图;二是页面跳转控制,返回上一页面,无需传送参数,也不必指定url

 

    解决这两个问题都使用到了Stack,对于视图控制,该Stack存储于ViewState中,对于页面控制,则存储与Session中;下面是编码部分:

  1. 页面跳转,首先在页面基类中设计属性:Urls和方法ShowPreviouseUrl();

    1. 代码
              Stack Urls
      
              {
      
                  get { return Session["Urls"] as Stack ?? new Stack(); }
      
                  set { Session["Urls"] = value; }
      
              }
      
      
    2. 代码
              protected void ShowPreviouseUrl()
      
              {
      
                    if (Urls.Count > 1)
      
                    {
      
                        Stack tempUrls = Urls;
      
                        tempUrls.Pop();
      
                        string url = tempUrls.Peek() as string;
      
                        Urls = tempUrls;
      
                        Response.Redirect(url);
      
                    }
      
              }
      
      
    3. 在页面基类中的OnLoad事件加入:
              if(!IsPostBack)
      
              {
      
                  string url = Request.Url.PathAndQuery;
      
                  if (Urls.Count == 0 || !url.Equals(Urls.Peek() as string))
      
                  {
      
                      Stack tempUrls = Urls;
      
                      tempUrls.Push(url);
      
                      Urls = tempUrls;
      
                  }
      
              }
      
      
      当页面载入触发OnLoad事件时,程序会获取当前页面完整的url,当Urls属性中不包含该url时,则将url插入Urls的顶部,然后存储在session中;
    4. 在具体的一个页面中放置一个返回链接,并加入事件即可:
              protected void LinkButtonBack_Click(object sender, EventArgs e)
      
              {
      
                  ShowPreviouseUrl();
      
              }
      
      
      当触发该事件时,程序会从session中拿取Urls属性值,并判断Urls个数大于1个时,先移除处于Urls顶部的Url,然后在获取下一顶部的Url,该Url就是要返回页面地址;最后通过Response.Redirect实现页面跳转。
  2. 页面中视图控制,同样在页面基类中设计属性Views和方法ShowPreviouseView()、ShowView():

    1. 代码
              Stack Views
      
              {
      
                  get { return ViewState["Views"] as Stack ?? new Stack(); }
      
                  set { ViewState["Views"] = value; }
      
              }
      
      
    2. 代码:
              protected void ShowPreviousePanel()
      
              {
      
                  Stack tempStatck = Views;
      
      
      
                  if (tempStatck.Count == 0 || tempStatck.Count == 1)
      
                  {
      
                      if (Urls.Count > 1)
      
                      {
      
                          Stack tempUrls = Urls;
      
                          tempUrls.Pop();
      
                          string url = tempUrls.Peek() as string;
      
                          Urls = tempUrls;
      
                          Response.Redirect(url);
      
                      }
      
                      return;
      
                  }
      
      
      
                  FindControl(Page, tempStatck.Pop() as string).Visible = false;
      
                  FindControl(Page, tempStatck.Peek() as string).Visible = true;
      
      
      
                  Panels = tempStatck;
      
      
      
              }
      该函数执行时,首先判断是否存在可返回的视图,如果存在,则显示上一视图,同时将当前视图从Views中移除;如果不存在,则检测是否存在上一页面,如果存在,则返回上一页面,否则不作相应。
    3. 代码:
              protected void ShowPanel(string viewId)
      
              {
      
                  Stack tempStatck = Views;
      
                  if (tempStatck.Count > 0)
      
                  {
      
                      FindControl(Page, tempStatck.Peek() as string).Visible = false;
      
                  }
      
      
      
                  Control targetView = FindControl(Page, viewId);
      
                  if (targetView == null)
      
                  {
      
                      throw new LogicException("没有找到要显示的视图");
      
                  }
      
      
      
                  targetView .Visible = true;
      
      
      
                  tempStatck.Push(viewId);
      
      
      
                  Views= tempStatck;
      
              }
      
      
              protected static Control FindControl(Control container, string ControlId)
      
              {
      
                  if (container != null && container.Controls.Count > 0)
      
                  {
      
                      if (container.FindControl(ControlId) == null)
      
                      {
      
                          foreach (Control item in container.Controls)
      
                          {
      
                              Control target = FindControl(item, ControlId);
      
                              if (target != null)
      
                              {
      
                                  return target;
      
                              }
      
                          }
      
                      }
      
                      else
      
                      {
      
                          return container.FindControl(ControlId);
      
                      }
      
                  }
      
                  return null;
      
      
      
              }
      输入的参数为某个视图的ID,程序通过递归的方式获取该视图控件,如果找不到该控件,则抛出异常;如果找到该视图,则显示之,而之前的视图会被隐藏(如果存在),同时程序会把即将显示的视图放入Views对象的顶部;最后将Views对象存储入ViewStatus中。
    4. 当编写某个应用时并需要多个操作时,可以考虑把该应用编写为一个aspx页面,而多个操作则编写为对应视图的操作;(这里暂不考虑rest规则)加入存在两个Panel,则将其Visible属性为false:
           <asp:Panel ID="PanelFileList" runat="server" Visible="false"></asp:Panel>
      
      
      
           <asp:Panel ID="PanelFielUpload" runat="server" Visible="false"></asp:Panel>
      然后再On_Load事件中确定显示某个视图:
      	ShowPanel(PanelFileList.ID)
    5. 返回上一视图,在返回控件加入onclick事件,并添加调用方法:
      	ShowPreviousePanel();
      该方法调用之后,程序会尝试显示上一视图,如果不存在上一视图,则尝试跳转页面至上一页面,如果不存在上一页面,则不作其他响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值