2

ナビゲーション アプリ テンプレートを使用してシルバー ライト アプリケーションを作成しています。内部使用のため、Windows 認証を使用します。ログインしたユーザー ID によってフィルター処理されたいくつかのレコードを表示するダッシュボード ページがあります。ユーザー ID (int) を取得するには、GetAuthenticatedUser をオーバーライドして Web サービスを呼び出し、(IPrincipal から) ユーザー名を渡します。このサービスは、詳細を返すのに時間がかかります。

ダッシュボード アプリに移動すると、ユーザー サービスが非同期操作であり、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 オーバーライドに入れてみましたが、うまくいきませんでした。

また、以下のように Frame の代わりに NavigationService を使用してみましたが、うまくいきませんでした

        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 に答える