0

我正在尝试跟踪 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。或替代解决方案...

4

2 回答 2

0

好的......一些调整让我的场景工作。不热衷于此解决方案,因此其他任何解决方案都会很好。

更改为 SecureLayoutsPageBase:

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 && Page.Request.Url.ToString() != this.PageController.PreviousUrl)
    {
        this.PageController.AddHistory(Page.Request.UrlReferrer.ToString());
    }
}

更改为 PageController:

[Serializable()]
public class PageController
{
    private Stack<string> _history = new Stack<string>();
    private string _previous;

    public void Previous(HttpResponse response)
    {
        _previous = _history.Pop();
        response.Redirect(_previous);
    }

    public void AddHistory(string url)
    {
        if(url != _previous)
        {
            _history.Push(url);
        }
    }

    public Stack<string> History
    {
        get
        {
            return _history;
        }
    }

    public string PreviousUrl
    {
        get
        {
            return _previous;
        }
    }
}
于 2013-08-15T14:59:07.213 回答
0

History(-1) 不起作用,因为这将包括回发。只需根据您所在的页面设置按钮 href 即可。如果您知道它已加载第 3 页,请将后退按钮设置为第 2 页

于 2013-08-15T14:32:35.677 回答