Property Bags Object Model中的小“陷阱”
今天在调试一个SharePoint程序的时候,发现一个Bug。SharePoint 2007中对SPWeb、SPFolder、SPListItem都提供了一个方便的Property Bags特性,用来存放一些自定义的属性信息,就像这样:
SPListItem item = ...;
item.Properties["MyProp1"] = "PropValue1";
item.Properties["MyProp2"] = "PropValue2";
item.Update();
我发现的Bug是,有一些存放在SPWeb.Properties中的自定义属性,没有正确的保存到Content Database中。仔细检查了一下,发现了原因所在。这个小问题确实容易成为一个代码中的“陷阱”,所以提醒一下大家。
SPFolder、SPListItem的Property Bags(即SPFolder.Properties / SPListItem.Properties)都是直接使用一个Hashtable来实现的,当我们调用SPFolder.Update()或SPListItem.Update()时,就能把它们的Property Bags里面的数据也写回到Content Database。
但是,SPWeb.Properties是通过一个定制的SPPropertyBag类(继承自System.Collections.Specialized.StringDictionary)来实现的,通过调用SPWeb.Update()并不会将Property Bags中的数据写回到Content Database,而是需要调用SPPropertyBag.Update()方法。示例:
SPWeb web = SPContext.Current.Web;
web.Properties["MyProp1"] = "PropValue1";
web.Properties.Update();
我不知道为什么它们有这样的设计区别,但个人猜测最大的可能,是SPFolder/SPListItem和SPWeb的实现不是一个Developer写的,写SPFolder/SPListItem的Developer想了一下,觉得使用一个简单的Hashtable就足够了,而写SPWeb的Developer则觉得应该专门定义一个SPPropertyBag类,这样整个项目中不同的需要使用Property Bags特性的类都可以重用这个SPPropertyBag。可惜,就像那句老话说的:“开发人员精心设计用来重用的东东,90%的可能都不会有被重用的可能”... :)
Property Bags Object Model中的小“陷阱”相关推荐
- ESXi与物理交换机静态链路聚合配置过程中的小陷阱
作者:陆斌 文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影 ...
- JavaScript中的小陷阱(不定期更新。。)
1. var scores = [1, 2, 3]; var total = 0; for (var score in scores) {total += score; }var mean = tot ...
- SAP 自定义 Table 中的小陷阱
在开发中经常会遇到这样的情况:一个表在启用了一段时间之后需要增加一些字段,而表中已经存在数据了. 添加字段是个很简单的工作,但是由此产生的查询问题却经常会困扰我们. 在 SE11 或者 SE16(N) ...
- C++ string中的几个小陷阱,你掉进过吗?
C++开发的项目难免会用到STL的string.使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1. 结构体中的stri ...
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为"样式",在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外 ...
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...
- Qt文档阅读笔记-Object Model
Object Model 标准C++对象模型提供了非常有效的运行时的对象范例.但是他的静态属性在某些领域是不灵活的.图形用户界面的编程领域需要运行时的效率和高等级的灵活.Qt提供了这样能力,通过C++ ...
- [js点滴(转)]JavaScript中的this陷阱的最全收集--没有之一
当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解释 ...
- 前端基础入门之js什么是DOM Document Object Model
文章目录 DOM 1.DOM简介 文档 对象 模型 2.节点 节点类型 节点属性 文档节点(Document) 元素节点(Element) 文本节点(Text) 属性节点(Attr) 3.事件 4.文 ...
- DOM---文档对象模型(Document Object Model)的基本使用
一.DOM简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.它是一种与平台和语言无关的应用程序接口(API),它可以动态 ...
最新文章
- jquery实现上传图片及图片大小验证、图片预览效果代码
- 如何对SQL Server数据库中的孤立用户和系统及用户建立映射
- C#.NET操作数据库通用类
- kali linux升级火狐,Kali安装最新firefox卸载旧的firefox
- 基线管理之Centos安全配置
- 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
- [css] 说说position:sticky有什么应用场景
- HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
- 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
- css3漂亮的渐变图案,CSS3 带渐变图案的圆球
- 如何直接操作SVN将分支代码合并到主干【转载】
- 赫/哈/霍 夫曼(Huffman)编码 游程编码
- 基于Java框架开发OA企业在线办公系统项目教程-附源码-毕业设计
- [JLOI2015]装备购买
- ERROR: pip‘s dependency resolver does not currently take into account all the packages that are ....
- 访问图片出现403的解决办法
- java中如何将十进制转换为二进制
- 用MATLAB画nyquist图时,怎样只花出一半的图?
- 解密一个量化对冲基金开发人员的工作内容
- 元素地牢服务器维修,《元素地牢》已正式开服!劝退地牢等你挑战!
热门文章
- Mac电脑如何调整鼠标灵敏度
- SoundSource for Mac - 音频控制工具
- UJAM Finisher FLUXX for Mac(综合效果器插件)
- Volume Manager for mac 详细教程
- Solidity基础入门知识---函数的访问权限和可见性
- CrazyWing:Python自动化运维开发实战 十八、Python面向对象
- Hadoop 解除 Name node is in safe mode(转)
- 未知账户(S-1-5-21)无法删除的问题
- 「leetcode」57. 插入区间:【模拟插入】详细讲解!
- 「leetcode」538.把二叉搜索树转换为累加树【递归】【迭代】详解