返回页面的处理方式
2008-07-13 15:39
387 查看
开发网站后台管理时,经常遇到页面返回的情况,如果采用history.go(-1)的方式返回上一页面,则有时在页面回发之后会停留在当前页面,需要点击多
bc3c
次;如果用ReturnUrl参数,则感觉使用场合不是很合适,而且需要在每个连接上面都指定ReturnUrl参数,虽然可以用Request.Url.PathAndQuery来获取当前页面的完整链接,但实现起来较为繁琐;我在参考了vs2005ASP.NET网站配置的代码之后,发现它是返回上一页的方式是使用Stack的方式来处理,即后进先出的方式;这样我整理了一下,发现通过这种方式来处理返回的应用很便捷。
这里主要解决两个问题:一个是视图控制,即要显示那个视图(上一视图会自动隐藏)和返回上一视图;二是页面跳转控制,返回上一页面,无需传送参数,也不必指定url。
解决这两个问题都使用到了Stack,对于视图控制,该Stack存储于ViewState中,对于页面控制,则存储与Session中;下面是编码部分:
页面跳转,首先在页面基类中设计属性:Urls和方法ShowPreviouseUrl();
代码
代码
在页面基类中的OnLoad事件加入:
当页面载入触发OnLoad事件时,程序会获取当前页面完整的url,当Urls属性中不包含该url时,则将url插入Urls的顶部,然后存储在session中;
在具体的一个页面中放置一个返回链接,并加入事件即可:
当触发该事件时,程序会从session中拿取Urls属性值,并判断Urls个数大于1个时,先移除处于Urls顶部的Url,然后在获取下一顶部的Url,该Url就是要返回页面地址;最后通过Response.Redirect实现页面跳转。
页面中视图控制,同样在页面基类中设计属性Views和方法ShowPreviouseView()、ShowView():
代码
代码:
该函数执行时,首先判断是否存在可返回的视图,如果存在,则显示上一视图,同时将当前视图从Views中移除;如果不存在,则检测是否存在上一页面,如果存在,则返回上一页面,否则不作相应。
代码:
输入的参数为某个视图的ID,程序通过递归的方式获取该视图控件,如果找不到该控件,则抛出异常;如果找到该视图,则显示之,而之前的视图会被隐藏(如果存在),同时程序会把即将显示的视图放入Views对象的顶部;最后将Views对象存储入ViewStatus中。
当编写某个应用时并需要多个操作时,可以考虑把该应用编写为一个aspx页面,而多个操作则编写为对应视图的操作;(这里暂不考虑rest规则)加入存在两个Panel,则将其Visible属性为false:
然后再On_Load事件中确定显示某个视图:
返回上一视图,在返回控件加入onclick事件,并添加调用方法:
该方法调用之后,程序会尝试显示上一视图,如果不存在上一视图,则尝试跳转页面至上一页面,如果不存在上一页面,则不作其他响应。
bc3c
次;如果用ReturnUrl参数,则感觉使用场合不是很合适,而且需要在每个连接上面都指定ReturnUrl参数,虽然可以用Request.Url.PathAndQuery来获取当前页面的完整链接,但实现起来较为繁琐;我在参考了vs2005ASP.NET网站配置的代码之后,发现它是返回上一页的方式是使用Stack的方式来处理,即后进先出的方式;这样我整理了一下,发现通过这种方式来处理返回的应用很便捷。
这里主要解决两个问题:一个是视图控制,即要显示那个视图(上一视图会自动隐藏)和返回上一视图;二是页面跳转控制,返回上一页面,无需传送参数,也不必指定url。
解决这两个问题都使用到了Stack,对于视图控制,该Stack存储于ViewState中,对于页面控制,则存储与Session中;下面是编码部分:
页面跳转,首先在页面基类中设计属性:Urls和方法ShowPreviouseUrl();
代码
Stack Urls { get { return Session["Urls"] as Stack ?? new Stack(); } set { Session["Urls"] = value; } }
代码
protected void ShowPreviouseUrl() { if (Urls.Count > 1) { Stack tempUrls = Urls; tempUrls.Pop(); string url = tempUrls.Peek() as string; Urls = tempUrls; Response.Redirect(url); } }
在页面基类中的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中;
在具体的一个页面中放置一个返回链接,并加入事件即可:
protected void LinkButtonBack_Click(object sender, EventArgs e) { ShowPreviouseUrl(); }
当触发该事件时,程序会从session中拿取Urls属性值,并判断Urls个数大于1个时,先移除处于Urls顶部的Url,然后在获取下一顶部的Url,该Url就是要返回页面地址;最后通过Response.Redirect实现页面跳转。
页面中视图控制,同样在页面基类中设计属性Views和方法ShowPreviouseView()、ShowView():
代码
Stack Views { get { return ViewState["Views"] as Stack ?? new Stack(); } set { ViewState["Views"] = value; } }
代码:
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中移除;如果不存在,则检测是否存在上一页面,如果存在,则返回上一页面,否则不作相应。
代码:
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中。
当编写某个应用时并需要多个操作时,可以考虑把该应用编写为一个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)
返回上一视图,在返回控件加入onclick事件,并添加调用方法:
ShowPreviousePanel();
该方法调用之后,程序会尝试显示上一视图,如果不存在上一视图,则尝试跳转页面至上一页面,如果不存在上一页面,则不作其他响应。
相关文章推荐
- 对于ajax请求,后端不能直接返回页面的处理方式
- iframe实现无刷新上传文件并在当前页面返回数据php处理方式
- 2016-12-03(两种处理JSON返回页面的方式、分页,ModelAndView和Model的区别,<C:forEach>注意)
- ajax如果是json方式,接收页面echo出的变量一定要有json_encode()处理,html页面的返回函数success才能正常alert出这个变量
- 对Action中返回的少量字符串的处理方式(不写转发页面)
- Ajax请求ashx返回各类数据的常见处理方式
- ASP.NET中jQuery调用WebService处理返回结果的方式
- 如何处理多页面重定向到同一页面后的返回问题
- Jquery 使用Ajax获取后台返回的Json数据后,页面处理
- Bootstrap 3 modal导致页面出现右边距的处理方式
- Ajax处理XML,XMLHttpRequest对象的创建和访问servlet并返回xml数据到页面展示
- java web异常友好页面处理的方式
- Android ActionBar Home按钮返回事件处理的两种方式
- C#中使用SQL语句生成DataTable,对不同的数据库,处理方式不同,返回的结果属性不同
- JQuery AJAX处理页面返回的XML
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
- Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
- Ajax请求ashx返回各类数据的常见处理方式
- Spring Boot自定义错误页面,Whitelabel Error Page处理方式
- [Java] 两种发起POST请求方法,并接收返回的响应内容的处理方式