随访系统学习笔记之ModelBinder
用户成功登录后,其所参与的课题、在课题中所扮演的角色以及在课题中所有权限执行的操作等等信息,
通常的做法是保存在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相关推荐
- Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...
- 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
零基础信号与系统学习笔记:复指数信号.傅里叶变换.三角函数正交性 基础1:复指数信号 复指数信号基础知识 复指数信号推导1 虚指数信号 虚指数信号特性和作用 直流信号 基础2:傅里叶级数 推导傅里叶级 ...
- django系统学习笔记
转自:http://hi.baidu.com/derris/item/7ca6013e330563fede2221ab 2010-02-07 00:12 django系统学习笔记--(1)hello ...
- linux系统学习笔记9——CANOpen状态转换
CANopen CANopen状态转换 CANopen状态转换 从节点上电和内部初始化之后自动进入预损作状太(Pre-operational State),在进入预操作之前,发送标准的启动对象(Boo ...
- uC/OS-II系统学习笔记(4)—— uC/OS-II概述上篇
1 临界段 uC/OS-II在处理临界段代码时,是需要关闭中断的,处理完毕之后再开中断,这使得uC/OS-II能够避免同时有其他任务或中断服务进入临界代码段. uC/OS-II定义了两个宏(macro ...
- linux系统学习笔记6——debian系统分屏操作(亲测)
debian系统分屏 刚插上HDMI链接屏幕后,发现两个屏幕是复制的效果 `步骤` xrandr | grep connecteda 1.查看现有的屏幕型号 由上图可以看到,一个是eDP-1 分辨率1 ...
- React系统学习笔记
***当前阶段的笔记 *** 「面向实习生阶段」https://www.aliyundrive.com/s/VTME123M4T9 提取码: 8s6v 点击链接保存,或者复制本段内容,打开「阿里云盘」 ...
最新文章
- runtime无法执行grep_让你的 Shell 命令执行可视化和告警
- eclipse制作uml_Eclipse生成一个UML
- C++中const与指针
- linux中initrd的含义,Linux2.6 内核的 Initrd 机制解析
- ffmpeg命令 抓屏_使用FFmpeg从视频中截图的命令 | 学步园
- kettle创建mysql资源库
- SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
- C++ 类的静态成员详细讲解(转)
- 凯撒密码加密,解密的实现,可以在项目上使用
- 微信小程序——定位(根据经纬度算距离)
- janusgraph 引入 java,janusgraph 默认server使用手记
- matlab 默认颜色顺序,MATLAB:设置行的颜色和样式顺序并行应用
- olcd12864的u8g2库_玩转u8g2 OLED库,一篇就够
- 怎么解决打印机“正在删除-已发送到打印机”打印状态
- MT7628平台编程设计指南资料
- 看到别人比自己优秀,为何会难受?
- 关于for循环的一些题目(二)
- 单片机的两个外围电路:复位电路和时钟电路
- linux下修改ext3硬盘为nst,Linux系统备份与恢复
- POE交换机供电线序及连结方法