今天在调试一个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中的小“陷阱”相关推荐

  1. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌 文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影 ...

  2. JavaScript中的小陷阱(不定期更新。。)

    1. var scores = [1, 2, 3]; var total = 0; for (var score in scores) {total += score; }var mean = tot ...

  3. SAP 自定义 Table 中的小陷阱

    在开发中经常会遇到这样的情况:一个表在启用了一段时间之后需要增加一些字段,而表中已经存在数据了. 添加字段是个很简单的工作,但是由此产生的查询问题却经常会困扰我们. 在 SE11 或者 SE16(N) ...

  4. C++ string中的几个小陷阱,你掉进过吗?

    C++开发的项目难免会用到STL的string.使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1.  结构体中的stri ...

  5. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为"样式",在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外 ...

  6. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  7. Qt文档阅读笔记-Object Model

    Object Model 标准C++对象模型提供了非常有效的运行时的对象范例.但是他的静态属性在某些领域是不灵活的.图形用户界面的编程领域需要运行时的效率和高等级的灵活.Qt提供了这样能力,通过C++ ...

  8. [js点滴(转)]JavaScript中的this陷阱的最全收集--没有之一

    当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解释 ...

  9. 前端基础入门之js什么是DOM Document Object Model

    文章目录 DOM 1.DOM简介 文档 对象 模型 2.节点 节点类型 节点属性 文档节点(Document) 元素节点(Element) 文本节点(Text) 属性节点(Attr) 3.事件 4.文 ...

  10. DOM---文档对象模型(Document Object Model)的基本使用

    一.DOM简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.它是一种与平台和语言无关的应用程序接口(API),它可以动态 ...

最新文章

  1. jquery实现上传图片及图片大小验证、图片预览效果代码
  2. 如何对SQL Server数据库中的孤立用户和系统及用户建立映射
  3. C#.NET操作数据库通用类
  4. kali linux升级火狐,Kali安装最新firefox卸载旧的firefox
  5. 基线管理之Centos安全配置
  6. 【ArcGIS微课1000例】0009:ArcGIS影像拼接(镶嵌、镶嵌至新栅格)
  7. [css] 说说position:sticky有什么应用场景
  8. HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
  9. 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
  10. css3漂亮的渐变图案,CSS3 带渐变图案的圆球
  11. 如何直接操作SVN将分支代码合并到主干【转载】
  12. 赫/哈/霍 夫曼(Huffman)编码 游程编码
  13. 基于Java框架开发OA企业在线办公系统项目教程-附源码-毕业设计
  14. [JLOI2015]装备购买
  15. ERROR: pip‘s dependency resolver does not currently take into account all the packages that are ....
  16. 访问图片出现403的解决办法
  17. java中如何将十进制转换为二进制
  18. 用MATLAB画nyquist图时,怎样只花出一半的图?
  19. 解密一个量化对冲基金开发人员的工作内容
  20. 元素地牢服务器维修,《元素地牢》已正式开服!劝退地牢等你挑战!

热门文章

  1. Mac电脑如何调整鼠标灵敏度
  2. SoundSource for Mac - 音频控制工具
  3. UJAM Finisher FLUXX for Mac(综合效果器插件)
  4. Volume Manager for mac 详细教程
  5. Solidity基础入门知识---函数的访问权限和可见性
  6. CrazyWing:Python自动化运维开发实战 十八、Python面向对象
  7. Hadoop 解除 Name node is in safe mode(转)
  8. 未知账户(S-1-5-21)无法删除的问题
  9. 「leetcode」57. 插入区间:【模拟插入】详细讲解!
  10. 「leetcode」538.把二叉搜索树转换为累加树【递归】【迭代】详解