场景, 网站用户的个性化配置较多, 而且容易发生增加和改变, 如何在数据库保存是个问题.

为了避免数据库表字段经常变更, 我们设计在表增加一个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[]持久化用户个性设置的更多相关文章

  1. Qt开发的应用记录读取用户习惯设置的方法

    Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...

  2. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(1)用户注册

    上一次把基本框架搭建起来了,这次开始整Web部分,终于可以看到界面了小激动一下.web项目部分从用户功能开始,基本有注册,登录.注销.查找.查看.删除等涉及Member区域和Manage区域. 目录: ...

  3. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码

    在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...

  4. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销

    上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...

  5. MVC5 网站开发之七 用户功能 1、角色的后台管理

    角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...

  6. MVC5 网站开发之七 用户功能 2 用户添加和浏览

    目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...

  7. MVC5 网站开发之七 用户功能 3用户资料的修改和删除

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...

  8. Android开发技巧——高亮的用户操作指南

    Android开发技巧--高亮的用户操作指南 2015-12-15补记: 发现使用PopupWindow进行遮罩层的显示,在华为P7上会有问题.具体表现为:画出来的高亮部分会偏下.原因为:通过view ...

  9. MVC5 网站开发实践 2.1、管理员登陆

    目录 MVC5 网站开发实践  概述 MVC5 网站开发实践  1.建立项目 MVC5 网站开发实践  2.后台管理   1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...

随机推荐

  1. git_sop 脚本使用说明

    tags : git 前言 脚本下载地址: git是功能非常强大的版本管理工具,同时它带来的是学习成本的上升.最近我们团队的部分项目采用了git进行版本管理,一部分小伙伴对于git使用不是很熟悉.一方 ...

  2. 10901 Missile

    10901 Missile 时间限制:1000MS  内存限制:65535K提交次数:40 通过次数:7 Description Long, long ago, country A invented ...

  3. html点击按钮 弹出 多选择窗口级联下拉复选

    参考代码 代码示例1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  4. GitHub中wiki的Markdown编辑方法!!

    Hello MarkDown!正常的文本 一级大标题用一个#号 一级中等标题用两个#号 一级小标题用三个#号(一次类推,一共有6级标题) 下面是无序列表 无序标题1-只需要在标题前面加上*号就可以了或 ...

  5. hdu 1028 Ignatius and the Princess III 简单dp

    题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...

  6. esc安装数据库 sqlserver mssql

    在服务器里面设置虚拟内存为:2G以上就可以安装了

  7. BZOJ 3572: [Hnoi2014]世界树

    BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...

  8. 22Mybatis_订单商品数据模型_多对多查询以及对多对多查询的总结

    之前讲了一对一,一对多查询,这篇文章讲的是多对多. 先给出需求:查询用户及用户购买商品信息. 我们由之前的文章知道,这个需求是多对多的. 还是那个终止我们的mybatis所做的不管是之前的一对一还是一 ...

  9. 16Spring_AOP编程(AspectJ)_最终通知

  10. ViewStub的简单解析和使用场景

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...