2

我正在使用导航应用程序模板创建银光应用程序。它供内部使用,因此使用 Windows 验证。有一个仪表板页面,其中显示了由登录用户 ID 过滤的几条记录。为了获取用户 ID(它是一个 int),我通过覆盖 GetAuthenticatedUser 并传递用户名(来自 IPrincipal)来调用 Web 服务。此服务需要一些时间才能返回详细信息。

当我导航到仪表板应用程序时,它完全呈现没有数据,因为用户服务是异步操作,我无法让呈现等到我的 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));
        }

虽然我收到消息框提示,但它实际上并没有带我进入登录页面,而是停留在仪表板页面中。我还尝试将此代码放在 OnNavigatedTo 覆盖中,但没有成功。

我也尝试使用 NavigationService 而不是 Frame,如下所示,没有运气

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

它仍然不起作用。有谁知道只有在我拥有完全有效的用户对象时才能使某些页面可访问?如果他们试图在没有这个的情况下访问受限页面,我希望他们能够重定向到登录页面,这如何实现?

我正在使用 Silverlight 3 Beta

什里达尔

4

1 回答 1

1

我终于找到了解决这个问题的方法。在 Constructo 中,我连接了 Loaded 事件处理程序,在事件处理程序中,我正在导航到另一个页面,现在它工作正常。

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

这段代码工作得很好!

什里达尔

于 2009-05-31T07:59:28.423 回答