在群里经常有人问基于SL的用户登录怎么实现,下面我以XCenter的用户登录为例。本篇文章主要针对初级选手。
先看看登录界面。这里要再一次感谢EasySL的作者,他不只给我们提供了一个类似EXT的美观的界面,而且给我们了一个很有参考价值的UI框架。
帐套和公司这里就不说了,都是WCF后台取数据绑定DropDownList。SL是纯客户端技术因此没有类似Asp.Net的Session的东西。但我们可以通过在App.cs里建一个Dictionary类型的实例变量来模拟Session的结构。只要App实例存在,那么这个变量就一直存在。
定义如下:
2
3 private Dictionary < string , object > session =
4 new Dictionary < string , object > ();
5 private Dictionary < string , Type > tempClassDic =
6 new Dictionary < string , Type > ();
7
8 /// <summary>
9 /// Session
10 /// </summary>
11 ///
12 public Dictionary < string , object > 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。来以假乱真
点击"登录"按钮后执行的动作如下:
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服务调用。回调函数如下:
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键是否存在,不存在添加,存在则替换其值。
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结构。
版權