2009-05-29 125 views
2

我正在使用導航應用程序模板創建銀色燈光應用程序。它用於內部使用,因此使用Windows驗證。有一個儀表板頁面,顯示幾個記錄過濾登錄用戶ID。要獲取用戶ID(這是一個int),我通過覆蓋GetAuthenticatedUser並傳遞用戶名(來自IPrincipal)來調用Web服務。此服務需要一些時間才能返回詳細信息。Silverlight導航和身份驗證服務

當我導航到儀表板應用程序時,它完全沒有數據呈現,因爲用戶服務是一個異步操作,我無法使渲染等到我的GetAuthenticatedUser完成完成。所以我創建了一個登錄頁面,它只顯示一個進度條,直到我獲得用戶對象,然後導航到儀表板。如果有人試圖通過使用URL直接訪問儀表板,我希望他們回到登錄頁面。

所以在儀表板的構造函數添加以下代碼

 if (!UserService.Current.User.IsAuthenticated) 
     { 
      MessageBox.Show("Navigating away"); 
      Frame objContainer = this.Parent as Frame; 
      objContainer.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative)); 
     } 

Thogh我得到的消息框提示,它實際上並沒有帶我到登錄頁面,但停留在儀表板頁面。我也試着把這個代碼放在OnNavigatedTo覆蓋沒有運氣。

我也嘗試過使用框架的NavigationService代替如下,沒有運氣

 if (!UserService.Current.User.IsAuthenticated) 
     { 
      MessageBox.Show("Navigating away"); 
      this.NavigationService.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative)); 
     } 

它仍然無法正常工作。有沒有人知道如何讓一些頁面可訪問,只有當我有完全有效的用戶對象?如果他們嘗試訪問受限制的頁面而沒有這樣做,我希望他們能夠重定向到登錄頁面,這怎麼能夠實現?

我使用Silverlight 3測試版

Shreedhar

回答

1

我終於找到了解決的辦法。在Constructo中,我連接了加載的事件處理程序,並在事件處理程序中導航到不同的頁面,現在工作正常。

public Dashboard() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Dashboard_Loaded); 
    } 

    void Dashboard_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (!UserService.Current.User.IsAuthenticated) 
     { 
      Frame objContainer = this.Parent as Frame; 
      if (objContainer != null) 
      { 
       objContainer.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative)); 
      } 
     } 
    } 

這段代碼工作得很好!

Shreedhar