用户成功登录后,其所参与的课题、在课题中所扮演的角色以及在课题中所有权限执行的操作等等信息,

通常的做法是保存在Session中,用时在从Session中取值,导致各方法与Session操作紧密关联,不方便调试,

项目中也有蛮多冗余代码。

最近,我开始维护某医院的随访系统,注意到它是这么处理的:

1)   使用IModelBinder接口自定义一个SessionModel的Binder类

 public class SessionModelBinder : IModelBinder{private const string SessionKey = "_sessionmodel";public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){           return GetSessionModel();}        public static SessionModel GetSessionModel(){SessionModel sp = (SessionModel)HttpContext.Current.Session[SessionKey];if (sp == null){sp = new SessionModel();HttpContext.Current.Session[SessionKey] = sp;}                       return sp;}public static User User{get{SessionModel sm = GetSessionModel();if (sm.User == null && HttpContext.Current.User.Identity.IsAuthenticated){sm.User = new UserService().GetUserInfo(HttpContext.Current.User.Identity.Name);HttpContext.Current.Session[SessionKey] = sm;}return sm.User;}}public static UserLoginInfo UserLoginInfo{get{SessionModel sm = GetSessionModel();if (sm.UserLoginInfo == null && HttpContext.Current.User.Identity.IsAuthenticated){sm.UserLoginInfo = new UserService().GetUserLoginInfo(HttpContext.Current.User.Identity.Name);HttpContext.Current.Session[SessionKey] = sm;}return sm.UserLoginInfo;}}  }  

2) 在SessionModel中存储了当前登录用户所参与的课题、在课题中所扮演的角色以及在课题中所有权限等信息。

当前账户登录时,获取到相应信息,写入SessionModel。

var userLoginInfo = new UserLoginInfo();
     if (string.IsNullOrWhiteSpace(_authentication.CheckLogin(name.Trim(), password.Trim(), ref userLoginInfo)))
     {
          _authentication.SignIn(userLoginInfo.UserId, false);
          sm.UserLoginInfo = userLoginInfo;
          ……
     }

3) 在Global.asax里面的Application_Start方法加入代码为Model绑定集合加入上面自定义的SessionModelBinder类。

ModelBinders.Binders.Add(typeof(SessionModel), new SessionModelBinder());

4) Controller中的Action,凡是需要获取当前登录用户信息,只要在参数中加入“SessionModel sm“即可,

运行时会从Session里面取key为SessionModel的对象。

public ActionResult UserMange(SessionModel sm, int pageIndex = 1, int pageSize = 10){//登录检查if (sm.User == null){string returnUrl = Url.Action("logon", "Account");return Redirect(returnUrl);}……}

5) 使用扩展:可以将需要的信息,都存储在SessionModel中

6) 个人评价:action与session没那么紧密;session数据取值在一处操作即可,代码冗余少

随访系统学习笔记之ModelBinder相关推荐

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证 ...

  2. Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...

  3. Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...

  4. 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用

    零基础信号与系统学习笔记:复指数信号.傅里叶变换.三角函数正交性 基础1:复指数信号 复指数信号基础知识 复指数信号推导1 虚指数信号 虚指数信号特性和作用 直流信号 基础2:傅里叶级数 推导傅里叶级 ...

  5. django系统学习笔记

    转自:http://hi.baidu.com/derris/item/7ca6013e330563fede2221ab 2010-02-07 00:12 django系统学习笔记--(1)hello ...

  6. linux系统学习笔记9——CANOpen状态转换

    CANopen CANopen状态转换 CANopen状态转换 从节点上电和内部初始化之后自动进入预损作状太(Pre-operational State),在进入预操作之前,发送标准的启动对象(Boo ...

  7. uC/OS-II系统学习笔记(4)—— uC/OS-II概述上篇

    1 临界段 uC/OS-II在处理临界段代码时,是需要关闭中断的,处理完毕之后再开中断,这使得uC/OS-II能够避免同时有其他任务或中断服务进入临界代码段. uC/OS-II定义了两个宏(macro ...

  8. linux系统学习笔记6——debian系统分屏操作(亲测)

    debian系统分屏 刚插上HDMI链接屏幕后,发现两个屏幕是复制的效果 `步骤` xrandr | grep connecteda 1.查看现有的屏幕型号 由上图可以看到,一个是eDP-1 分辨率1 ...

  9. React系统学习笔记

    ***当前阶段的笔记 *** 「面向实习生阶段」https://www.aliyundrive.com/s/VTME123M4T9 提取码: 8s6v 点击链接保存,或者复制本段内容,打开「阿里云盘」 ...

最新文章

  1. runtime无法执行grep_让你的 Shell 命令执行可视化和告警
  2. eclipse制作uml_Eclipse生成一个UML
  3. C++中const与指针
  4. linux中initrd的含义,Linux2.6 内核的 Initrd 机制解析
  5. ffmpeg命令 抓屏_使用FFmpeg从视频中截图的命令 | 学步园
  6. kettle创建mysql资源库
  7. SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
  8. C++ 类的静态成员详细讲解(转)
  9. 凯撒密码加密,解密的实现,可以在项目上使用
  10. 微信小程序——定位(根据经纬度算距离)
  11. janusgraph 引入 java,janusgraph 默认server使用手记
  12. matlab 默认颜色顺序,MATLAB:设置行的颜色和样式顺序并行应用
  13. olcd12864的u8g2库_玩转u8g2 OLED库,一篇就够
  14. 怎么解决打印机“正在删除-已发送到打印机”打印状态
  15. MT7628平台编程设计指南资料
  16. 看到别人比自己优秀,为何会难受?
  17. 关于for循环的一些题目(二)
  18. 单片机的两个外围电路:复位电路和时钟电路
  19. linux下修改ext3硬盘为nst,Linux系统备份与恢复
  20. POE交换机供电线序及连结方法

热门文章

  1. react总结之jsx是什么,jsx语法规则
  2. 扒一扒DDR4的新功能和PCB设计上的一些注意事项--转
  3. 脑洞大开,晚安月亮纸尿裤透气性实验!
  4. 量化投资:为什么在中国发展之路任重而道远
  5. Linux命令行初体验
  6. spring security oauth2.0 client集成第三方登录
  7. 压缩解压工具gzip、pigz、gtz大比较
  8. 文本字段的html标签是什么,HTML常用标签及属性
  9. 面试官:Redis如何实现持久化的、主从哨兵又是什么?
  10. iOS上二维码和一维码识别系列一