快速业务通道

微型项目实践(9):页面的数据访问策略

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
问题。

我们经常会在用户登录的时候,在Session中储存登陆的用户:

User user = GetLoginUser(username, password);
if (user != null)
  Session["CurrentUser"] = user;
else
  Response.Redirect("Login.aspx");

这样以后我们就可以用Session["CurrentUser"]取得当前用户了。当用户新建一篇日志时,我们会使 用类似下面的代码:

Blog blog = new Blog();
blog.Creator = Session["CurrentUser"] as User;
blog.Save(Database);

问题来了:上面两个代码通常来说不是发生在一个页面中,也就是说,从数据库中读取该user的 DataContext早已不存在了,而新的、用于存储Blog的DataContext会认为这个blog相关的Creator是一个 “新”的User,所以会在数据库中插入一条新的User记录,而不是和原来的User记录建立关联!为了避免 这个情况,我们必须用Attach方法将Session["CurrentUser"]附加到新的DataContext中,上面的代码要 这么改:

Database.Users.Attach(Session["CurrentUser"] as User);
Blog blog = new Blog();
blog.Creator = Session["CurrentUser"];
blog.Save(Database);

但是假设User还有关联的实体,比如Role、Power之类的东西,就需要全部附加上!否则就会插入新的 关联记录!这几乎是不可能的,所以我们要保证每一个页面周期中所有的实体来源于同一个DataContext ,对于上面这个例子,解决办法是不保存User,而保存UserID:

User user = GetLoginUser(username, password);
if (user != null)
  Session["CurrentUserID"] = user.ID;
else
  Response.Redirect("Login.aspx");

这样我们就可以在添加日志时这样写:

Blog blog = new Blog();
blog.Creator = Database.Users.GetByID(Convert.ToInt32(Session["CurrentUserID"]));
blog.Save(Database);

进一步,我们可以在PageBase中加载User,考虑在PageBase中存在以下代码:

private User _CurrentUser;
public User CurrentUser
{
  get
  {
    if(Session["CurrentUserID"] == null)
      return null;
    if(_CurrentUser == null)
      _CurrentUser = Database.Users.GetByID(Convert.ToInt32(Session

["CurrentUserID"]));
    return _CurrentUser;
  }
}

这样我们就可以使用以下的代码建立日志了:

Blog blog = new Blog();
blog.Creator = CurrentUser;
blog.Save(Database);

关于PageBase的用处还有很多,包括但不限于以下这些:

构造Database。

构造当前User。

判断当前用户是否具有该页面的访问权限。

根据当前用户定制页面:加入不同的Css等。

另外,基于PageBase的扩展方法,将对所有页面有效,这点常常用于执行JavaScript。

下一篇中,我们开始编写我们第一个页面。

本文配套源码

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号