您的位置:首页 > 其它

Silverlight实现查询建模(五) 用户登录

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


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




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

定义如下:






Code

#region Prop

        private Dictionary<string, object> session =
            new Dictionary<string, object>();
        private Dictionary<string, Type> tempClassDic =
            new Dictionary<string, Type>();

        /// <summary>
        /// Session
        /// </summary>
        /// 
        public Dictionary<string, object> Session
        {
            get { return session; }
            set { session = value; }
        }

        /// <summary>
        /// 数据产生的临时类列表
        /// </summary>
        public Dictionary<string, Type> TempClassDic
        {
            get { return tempClassDic; }
            set { tempClassDic = value; }
        }

        #endregion

这里特意将这个变量起名为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         }


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

Code
 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         }


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

/// <summary>
        /// 添加Session信息,不存在就添加,存在则替换
        /// </summary>
        /// <param name="sessionKey"></param>
        /// <param name="value"></param>
        public static void Add2Session(string sessionKey, object value)
        {
            if (!Session.ContainsKey(sessionKey))
                Session.Add(sessionKey, value);
            else
                Session[sessionKey] = value;
        }


核心概念就是模拟Asp.Net中的Session结构
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: