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

为了避免数据库表字段经常变更, 我们设计在表增加一个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. (四) openwrt单个ipk编译过程

    Tags : Makefile 本周是成胖子每周一博的第五周. 更好的阅读体验,请点击这里 [TOC] 前言 前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单 ...

  2. eclipse在Ubuntu 13.04下的安装过程及问题小记

    一.eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:http://www.eclipse.org/downloads/? ...

  3. selenium更改readonly属性

    1.用js实现 JavascriptExecutor removeAttribute = (JavascriptExecutor)dr;        //remove readonly attrib ...

  4. 伪多项式时间算法Pseudo-polynomial Algorithms-----geeksforGeek 翻译

    原创翻译加学习笔记,方便国人学习算法知识! 原文链接http://www.geeksforgeeks.org/pseudo-polynomial-in-algorithms/ 什么是伪多项式? 当一个 ...

  5. 边工作边刷题:70天一遍leetcode: day 79

    3Sum Smaller 要点:类似的题还有lintcode的triangle count:https://github.com/delbao/onlineJudge/blob/master/lint ...

  6. AC日记—— codevs 1031 质数环(搜索)

    题目描述 Description 一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数.如下图是一个大小为6的质数环.为了方便描述,规定数环上 ...

  7. 解决Linux中java.net.UnknownHostException: oracledb.sys.iflashbuy.com问题

    Linux环境报java.net.UnknownHostException: oracledb.sys.iflashbuy.com,原因为Linux下无法解析oracledb.sys.iflashbu ...

  8. Javascript中的对象和原型(3)

    在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型 ...

  9. 关于表格前面checkbox复选框不打勾的问题

    当点击左边的树节点的时候,让右边的表格自动选中相应的行,但是选中的行前面如果有checkbox,可能复选框虽然选中了但是不打上勾,解决方案,将遍历表格数据那段代码用延时器包裹一下.

  10. 如何将list转为json?