Windows Phone Silverlight 开发中的多个条件

Multiple conditions in Windows Phone Silverlight development

我正在开始 Windows Phone 开发 Silverlight 和 Web 服务。我有一个用于用户登录的 Web 服务,在允许用户登录之前我有两个检查。我无法执行这两个检查。只调用一张支票。我的代码:

private void login_action(object sender, RoutedEventArgs e)
        {
            string _username = txtUser.Text;
            string _password = txtPass.Password;
            kollserviceClient client = new kollserviceClient(); 
            client.validUserCredentialAsync(_username, _password);
            client.validUserCredentialCompleted += Client_validUserCredentialCompleted;
            client.isStudentUserAsync(_username);
            client.isStudentUserCompleted += Client_isStudentUserCompleted;

        }

        private void Client_isStudentUserCompleted(object sender, isStudentUserCompletedEventArgs e)
        {
            if (!e.Result)
            {
                MessageBox.Show("User is Not a Student. Unable to Login", "Error", MessageBoxButton.OK);
                return;
            }
        }

        private void Client_validUserCredentialCompleted(object sender, validUserCredentialCompletedEventArgs e)
        {
            if (e.Result)
            {
                IsolatedStorageSettings.ApplicationSettings["lgusername"] = txtUser.Text;
                NavigationService.Navigate(new Uri("/Home.xaml", UriKind.RelativeOrAbsolute));
            }
        }

如果凭据有效,则无论 he/she 是否为学生用户,用户都可以登录。如何执行这两项检查?

这种编码方式,我不相信你能保证服务调用的顺序 return。因此,您可以存储每个调用的结果,然后调用第三个方法来评估两个调用都已 returned。另一种选择是链接调用,这样它就不会检查用户是否是学生,直到它 return 从凭据检查并通过,然后您可以从该调用的 return 导航。

第一个选项示例:

private void login_action(object sender, RoutedEventArgs e)
{
    string _username = txtUser.Text;
    string _password = txtPass.Password;
    kollserviceClient client = new kollserviceClient(); 
    client.validUserCredentialAsync(_username, _password);
    client.validUserCredentialCompleted += Client_validUserCredentialCompleted;
    client.isStudentUserAsync(_username);
    client.isStudentUserCompleted += Client_isStudentUserCompleted;

}
private bool? isStudent = null;
private bool? isAuthenticated = null;

private void Client_isStudentUserCompleted(object sender, isStudentUserCompletedEventArgs e)
{
    isStudent = e.Result;
    EvaluateAndNavigate();

}

private void Client_validUserCredentialCompleted(object sender, validUserCredentialCompletedEventArgs e)
{
    isAuthenticated = e.Result;
    if (isAuthenticated)
    {
        IsolatedStorageSettings.ApplicationSettings["lgusername"] = txtUser.Text;
    }
    EvaluateAndNavigate();
}

private void EvaluateAndNavigate()
{
    if(isStudent.HasValue && isAuthenticated.HasValue) //both calls have returned
    {
        if(isStudent.Value && isAuthenticated.Value)
        {
            NavigationService.Navigate(new Uri("/Home.xaml", UriKind.RelativeOrAbsolute));
        }
        else
        {
            MessageBox.Show(string.Format("{0}Unable to Login", isStudent.Value ? "" : "User is Not a Student. " ), "Error", MessageBoxButton.OK);
        }
    }
}