【转】Silverlight实现用户登录
现在微软的Silverlight很不错,整理下不错的Silverlight实例教程给大家看下,本系列的教程来自cnblogs的博客,本站做有转载说明,尊重作者的知识版权。
在群里经常有人问基于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。来以假乱真
点击"登录"按钮后执行的动作如下:
Code
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键是否存在,不存在添加,存在则替换其值。
Code
/// <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结构。
文章来自学IT网:http://www.xueit.com/asp.net/show-4501-2.aspx