2009-05-29 124 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