我正在尝试跟踪 ASP.NET 中多个 Web 窗体之间的导航。我已经使用以下方法尝试了客户端后退导航:
<asp:Button ID="BackButton" runat="server" Text="Back"
OnClientClick="JavaScript:window.history.back(1);return false;" />
不幸的是,由于回发正在进行,这不适用于我的场景。我的场景有许多 Web 表单:
- 第1.1页
- 第1.2页
- 第2页
- 第3页
在页面中向前导航的工作方式类似于向导。有 2 个起点 - 从 Page1.1 和 Page1.2。
第1.1页->第2页->第3页第1.2页->第
2页->第3页
所以点击后退按钮会有以下导航:
第3页->第2页第2
页->第1.1页第2页->第1.2
页
在需要维护的页面之间传递了额外的参数。
我目前正在考虑在 Session 中维护一些东西以维护当前的调用堆栈,这在某种程度上是可行的,但是,我正在建立引荐来源网址。目前我只是想把这个概念化。
我在 SharePoint 中将其作为应用程序页面运行,但是对于本示例而言,每个页面本质上都是一个 ASP.NET 页面。
所以我为每个Page引入了一个抽象类:
public abstract class SecureLayoutsPageBase : System.Web.UI.Page
{
private PageController _pageController;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_pageController = (PageController)Session["PageController"];
if (_pageController == null)
{
_pageController = new PageController();
Session["PageController"] = _pageController;
}
if (!Page.IsPostBack && Page.Request.UrlReferrer != null)
{
this.PageController.History.Push(Page.Request.UrlReferrer.ToString());
}
}
protected PageController PageController
{
get
{
return _pageController;
}
}
}
其中有一个 PageController 的实例:
[Serializable()]
public class PageController
{
private Stack<string> _history = new Stack<string>();
public void Previous(HttpResponse response)
{
string previous = _history.Pop();
response.Redirect(previous);
}
public Stack<string> History
{
get
{
return _history;
}
}
}
然后每个页面将在服务器端事件处理程序中调用 PageController.Previous 以进行后退按钮单击:
protected void BackButton_Click(object sender, EventArgs e)
{
this.PageController.Previous(this.Response);
}
这个问题是调用 PageController.Previous 仍然会导致 Url 被添加到堆栈中。我只是想知道是否有一种方法可以防止在单击返回时添加 URL。或替代解决方案...