Silverlight实现用户登录

Title现在微软的Silverlight很不错,整理下不错的Silverlight实例教程给大家看下,本系列的教程来自cnblogs的博客,本站做有转载说明,尊重作者的知识版权。

  在群里经常有人问基于SL的用户登录怎么实现,下面我以XCenter的用户登录为例。本篇文章主要针对初级选手。

  先看看登录界面。这里要再一次感谢EasySL的作者,他不只给我们提供了一个类似EXT的美观的界面,而且给我们了一个很有参考价值的UI框架。

 帐套和公司这里就不说了,都是WCF后台取数据绑定DropDownList。SL是纯客户端技术因此没有类似Asp.Net的Session的东西。但我们可以通过在App.cs里建一个Dictionary类型的实例变量来模拟Session的结构。只要App实例存在,那么这个变量就一直存在。

  定义如下:

 

 1 #region Prop
 2 
 3         private Dictionary<stringobject> session =
 4             new Dictionary<stringobject>();
 5         private Dictionary<string, Type> tempClassDic =
 6             new Dictionary<string, Type>();
 7 
 8         /// <summary>
 9         /// Session
10         /// </summary>
11         /// 
12         public Dictionary<stringobject> Session
13         {
14             get { return session; }
15             set { session = value; }
16         }
17 
18         /// <summary>
19         /// 数据产生的临时类列表
20         /// </summary>
21         public Dictionary<string, Type> TempClassDic
22         {
23             get { return tempClassDic; }
24             set { tempClassDic = value; }
25         }
26 
27         #endregion
28 
29 

 

 

这里特意将这个变量起名为Session。来以假乱真

点击"登录"按钮后执行的动作如下:

 1 private void Submit_Click(object sender, RoutedEventArgs e)
 2          {
 3              AccountVO account = (AccountVO)cbAccount.SelectedItem;
 4              DeptVO dept = (DeptVO)cbDept.SelectedItem;
 5              string userId = userName.Text.Trim();
 6              string pwd = password.Password.Trim();
 7              if (String.IsNullOrEmpty(userId) || String.IsNullOrEmpty(pwd))
 8              {
 9                  WindowHelper.TimeAlert("用户名或密码不能为空!");
10                  return;
11              }
12              try
13              {
14                  WindowHelper.ShowLoading("正在验证用户信息.");
15                  if (account.Code.Equals("0000"))
16                  {
17                      //系统管理帐套
18                      if (account.Admin == null)
19                      {
20                          WindowHelper.TimeAlert("系统管理帐套未指定管理员");//TODO:多语处理
21                          return;
22                      }
23                      if (account.Admin.AdminCode.Equals(userId)
24                          && account.Admin.Password.Equals(pwd))
25                      {
26                          //记录Session信息
27                          UserVO user = new UserVO()
28                          {
29                              Code = account.Admin.AdminCode,
30                              Name = account.Admin.AdminName
31                          };
32                          WindowHelper.Add2Session(SessionConst.SK_User, user);
33                          //带场景跳转
34                          WindowHelper.Navigate(new FadeTransition(), new Page());
35                      }
36                  }
37                  else
38                  {
39                      //模拟上下文环境
40                      ServiceContext context = new ServiceContext();
41                      context.Account = account;
42                      //记录帐套信息
43                      ClientEnvironment.Instance.Account = account;
44                      WindowHelper.Add2Session(SessionConst.SK_Account, context.Account);
45                      //记录单位信息
46                      ClientEnvironment.Instance.Dept = dept;
47                      WindowHelper.Add2Session(SessionConst.SK_Dept, context.Dept);
48                      UserSrv.UserServiceClient service = new XCenter.UI.UserSrv.UserServiceClient();
49                      service.UserLoginCompleted += new EventHandler<XCenter.UI.UserSrv.UserLoginCompletedEventArgs>(service_UserLoginCompleted);
50                      service.UserLoginAsync(userId, dept.Id, pwd, context);
51                  }
52              }
53              catch (Exception ex)
54              {
55                  string msg = ex.Message;
56              } 
57  
58          }
59 

 

 

代码都很简单,抛去自己特有的逻辑看40-50行,40-47行主要逻辑就是将帐套和单位信息记录到我自己的数据结构中,ServiceContext主要就是和WCF通讯的客户端环境信息,ClientEnvironment其实就是这些信息的客户端快照,这是一个单例类,统一把客户端信息放这里便于使用。48-49行是实际的用户登录的WCF服务调用。回调函数如下:

 1   void service_UserLoginCompleted(object sender, XCenter.UI.UserSrv.UserLoginCompletedEventArgs e)
 2          {
 3              XCenter.Framework.Public.Core.ReturnVO<UserVO> result = e.Result;
 4              if (result.IsSucc)
 5              {
 6                  //记录Session信息
 7                  ClientEnvironment.Instance.User = result.ReturnValue;
 8                  WindowHelper.Add2Session(SessionConst.SK_User, result.ReturnValue);
 9                  //带场景跳转
10                  WindowHelper.Navigate(new FadeTransition(), new Page());
11              }
12              else
13              {
14                  //调用成功时场景已经切换,再不用隐藏什么
15                  WindowHelper.HideLoading();
16                  WindowHelper.Confirm(result.ErrorMessage, new OnConfirm(Login_Confirm));
17              }
18          }
19 

 

 7-8行就是当登录成功后记录用户信息到Session中。下面就是带动画场景跳转,这在以后文章中在描述。添加Session的Helper方法很简单就是判断Session键是否存在,不存在添加,存在则替换其值。

 1 /// <summary>
 2         /// 添加Session信息,不存在就添加,存在则替换
 3         /// </summary>
 4         /// <param name="sessionKey"></param>
 5         /// <param name="value"></param>
 6         public static void Add2Session(string sessionKey, object value)
 7         {
 8             if (!Session.ContainsKey(sessionKey))
 9                 Session.Add(sessionKey, value);
10             else
11                 Session[sessionKey] = value;
12         }

 

好了用户登录就这么简单。核心概念就是模拟Asp.Net中的Session结构。

 

版權

文章來源:自學IT網 http://www.xueit.com/asp.net/show-4501-2.aspx

posted @ 2010-03-18 10:54  CuiQG  阅读(5046)  评论(1编辑  收藏  举报