网站开发技巧, 使用byte[]持久化用户个性设置
场景, 网站用户的个性化配置较多, 而且容易发生增加和改变, 如何在数据库保存是个问题.
为了避免数据库表字段经常变更, 我们设计在表增加一个varbinary(max)字段存储个性化配置.
个性化的配置则存储到dictionary<string,string>中. 然后序列化成bytes即可.
见代码
先来一个帮助类
///
/// 持久个性化设置的类 public class ModelSetting
///
{ private Dictionary _hash;
public ModelSetting() {
_hash = new Dictionary();
} ///
/// 把数据库中的bytes转化成可用的dictionary ///
///
public void Load(byte[] bytes)
{
using (MemoryStream ms1 = new MemoryStream(bytes)) {
BinaryFormatter bf = new BinaryFormatter();
_hash = (Dictionary)bf.Deserialize(ms1);
}
}
///
/// 把实体中的dictionary转成bytes ///
///
public byte[] ToByteArray()
{
using (MemoryStream ms1 = new MemoryStream())
{
BinaryFormatter b = new BinaryFormatter();
b.Serialize(ms1, _hash);
return ms1.ToArray();
}
} public ICollection Keys
{
get
{
return _hash.Keys;
}
} public string Get(string Name, string Def){
if (_hash.ContainsKey(Name))
return _hash[Name];
else
return Def;
}
public void Set(string Name, string Val)
{
if (Val == null)
Val = "";
_hash[Name] = Val;
}
}
然后在domain中的模型中增加如下代码
///
/// Setting设置帮助类 protected ModelSetting modelsetting = new ModelSetting();
///
private Dictionary _allSettings = new Dictionary();
private bool _isLoaded = false;
///
/// 通过这个访问个性化设置 public Dictionary AllSettings
///
{
get {
if (!_isLoaded)
LoadSettings();
return _allSettings;
}
} ///
/// 将二进制的内容加载成具体的对象 private void LoadSettings()
///
{
if (Settings != null && Settings.Length > 1)
{
modelsetting.Load(Settings); _allSettings.Clear();
foreach (string key in modelsetting.Keys)
{
_allSettings.Add(key, modelsetting.Get(key, string.Empty));
} _isLoaded = true;
}
}
///
/// 将单一的某个设置的键值对,存入网站本身二进制的Setting里. ///
/// 本方法只是临时将键值对,放入字典。真正更新数据库,还需要SaveSetting()再Update(YibuSite)
///
///
public void SetOneSetting(string key, string value)
{
if (AllSettings.ContainsKey(key))
{
AllSettings[key] = value;
}
else
{
AllSettings.Add(key, value);
}
}
public void SaveSetting()
{
foreach (string key in _allSettings.Keys)
{
modelsetting.Set(key, _allSettings[key]);
}
Settings = modelsetting.ToByteArray();
}
存储和取值
public ActionResult TestModelSetting() {
var temp = _userservice.Table.First();
temp.SetOneSetting("xiaomi", "jianjialin");
temp.SetOneSetting("mobile","13900000000");
temp.SaveSetting();
_userservice.Update(temp);
var temp2 = _userservice.Table.First();
return Content(temp2.AllSettings["xiaomi"]);
}
网站开发技巧, 使用byte[]持久化用户个性设置的更多相关文章
- Qt开发的应用记录读取用户习惯设置的方法
Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(1)用户注册
上一次把基本框架搭建起来了,这次开始整Web部分,终于可以看到界面了小激动一下.web项目部分从用户功能开始,基本有注册,登录.注销.查找.查看.删除等涉及Member区域和Manage区域. 目录: ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
- MVC5 网站开发之七 用户功能 1、角色的后台管理
角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- MVC5 网站开发之七 用户功能 3用户资料的修改和删除
这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...
- Android开发技巧——高亮的用户操作指南
Android开发技巧--高亮的用户操作指南 2015-12-15补记: 发现使用PopupWindow进行遮罩层的显示,在华为P7上会有问题.具体表现为:画出来的高亮部分会偏下.原因为:通过view ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...
随机推荐
- git_sop 脚本使用说明
tags : git 前言 脚本下载地址: git是功能非常强大的版本管理工具,同时它带来的是学习成本的上升.最近我们团队的部分项目采用了git进行版本管理,一部分小伙伴对于git使用不是很熟悉.一方 ...
- 10901 Missile
10901 Missile 时间限制:1000MS 内存限制:65535K提交次数:40 通过次数:7 Description Long, long ago, country A invented ...
- html点击按钮 弹出 多选择窗口级联下拉复选
参考代码 代码示例1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- GitHub中wiki的Markdown编辑方法!!
Hello MarkDown!正常的文本 一级大标题用一个#号 一级中等标题用两个#号 一级小标题用三个#号(一次类推,一共有6级标题) 下面是无序列表 无序标题1-只需要在标题前面加上*号就可以了或 ...
- hdu 1028 Ignatius and the Princess III 简单dp
题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...
- esc安装数据库 sqlserver mssql
在服务器里面设置虚拟内存为:2G以上就可以安装了
- BZOJ 3572: [Hnoi2014]世界树
BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...
- 22Mybatis_订单商品数据模型_多对多查询以及对多对多查询的总结
之前讲了一对一,一对多查询,这篇文章讲的是多对多. 先给出需求:查询用户及用户购买商品信息. 我们由之前的文章知道,这个需求是多对多的. 还是那个终止我们的mybatis所做的不管是之前的一对一还是一 ...
- 16Spring_AOP编程(AspectJ)_最终通知
- ViewStub的简单解析和使用场景
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...