2013-08-15 2 views
0

Я пытаюсь отслеживать навигацию между несколькими веб-формами в ASP.NET. Я пытался стороне клиента обратно навигации, используя следующие:Обратная связь ASP.NET для нескольких форм

<asp:Button ID="BackButton" runat="server" Text="Back" 
      OnClientClick="JavaScript:window.history.back(1);return false;" /> 

К сожалению, это не работает для моего сценария из-постбэков происходит. Мой сценарий имеет ряд веб-форм:

  • Page1.1
  • Page1.2
  • Page2
  • Page3

Перемещение вперед по страницам работает аналогично мастера. Есть две стартовые точки - от Страница1.1 и Страница 2.1.

Page1.1 -> Стр.2 -> Page3
Page1.2 -> Стр.2 -> Page3

Так нажатия кнопки назад будет иметь следующую навигацию:

Page3 -> Page2
Page2 - > Page1.1
Page2 -> Page1.2

Между страницами, которые необходимо сохранить, имеются дополнительные параметры.

В настоящее время я смотрю на то, чтобы поддерживать что-то в сеансе, чтобы поддерживать текущий стек вызовов, который несколько работает, однако, я получаю сбор ссылок для рефереров. В ту минуту я просто пытаюсь это понять.

Я использую это в SharePoint как страницы приложения, однако каждая страница по существу является страницей ASP.NET для этого примера.

Так я ввел абстрактный класс для каждой страницы:

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-адреса, когда он был нажат. Или альтернативные решения ...

ответ

0

История (-1) не работает, потому что это будет включать в себя обратную передачу. Просто установите кнопку href в зависимости от того, на какой странице вы находитесь. Если вы знаете его загруженную страницу 3, установите кнопку «Назад» на стр. 2

+0

Да, это своего рода прямо вперед, но потом вы вернетесь к странице 2, и нажмите кнопку назад на странице 2, как ты знаешь, куда вернуться? Страница1.1 или Страница1.2! – Andez

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; 
     } 
    } 
}