Sharepoint带自定义属性的FieldType
先闲话几句,有意义的内容在后面。
新项目中,很多东西都感觉却要自己写FieldType,如前面所说,在UI可定制方面,FieldType还有很多不足。虽然貌似今天看到TemplateName会起一些作用(未测试),但实际上修改起来也是相当麻烦的。
今天原本准备写一个DateTime的FieldType的,WSS3自带的的DateTime FieldType在Firefox下没有Calendar来选日期,就为这一个“小小”功能,原准备怎么修改原来的FieldType来实现兼容(可以一改就把原有的List中一并做到兼容了,跟RichText改成TinyMCE编辑一样),结果是失败。另外,WSS3的DateTime FieldType弹出的Calendar并不是无刷新的,点出来的速度之慢——已经超出我忍受的范围。
另一个是想增加一个更好的Dropdownlist,原来是想增加一个ComboBox的东东的记得某次看到过?在某个同事做的站点上看到过,最终也不知道怎么做出来的。
WSS自带的Dropdownlist只有一个Value属性,而且,存入的就直接是Value了,估计是为了简化一些细节吧。Value和Text是用的同一个。我想写一个可以同时设置Value和Text属性的Dropdownlist(我的Value需要数字值,要拿来做其它的计算用)。
之前做的FieldType都只是一个Edit,一个Render而已,并不会在选择到List的时候给初始值(像Dropdownlist的Items),看了几眼那个代码觉得太复杂了。今天实在是无耐,只好自己再硬着头皮看代码,并且写出这样的FieldType。
最后,我看着网上的代码有不习惯的地方,看WSPBuilder生成的代码也有不习惯的地方,最终么,中和成了一个我习惯一些的代码 :( 成了跟两边都不相同,不知这样会不会生成一些麻烦~~~
可能有点意义的正文
1.FieldType的实现,例子很多,参见末尾的参考
A.《Inside WSS 3.0》(网上有电子书,各部分内容都很全面)
B.WSP Builder里面新创建一个FieldType。
C.VS WSS Extension应该也可以生成,我没有安装,没测过。
2.需要的文件:
普通的FieldType(4个文件):
fldty_TestField.xml(Field的XML定义)
TestField.cs(Field的定义,会设置调用哪一个FieldControl来编辑或显示)
TestFieldControl.cs(定义此Field的编辑与显示,以及获取值的方法[Value],在此要区分是否Display状态)
TestFieldEditor.ascx(会在FieldControl类中被调用(一般只是FindControl方式去找控件而已,并不是一般的UserControl关系)
有自定义属性的增加2个:
TestFieldProEditor.ascx(设置属性的UserControl,需要在xml中指明,且有后台代码类)
TestFieldPro.cs(上一个文件需要的类,基本上跟普通的UserControl一样了)
多Column的FieldType增加一个:
TestFieldValue.cs(多Column值的定义)
3.WSPBuilder生成的代码
A.WSPBuilder生成的代码没有TestFieldControl.ascx,是自己直接给出控件的,我还是手动把这个添加上去了,觉得这样写起来要容易一些,修改也简便一点。
B.WSPBuilder生成的为带有自定义属性的FieldType,我想这种一般不会太多吧,删除掉多余的。
C.WSPBuilder生成的东东,TestField.cs写得很复杂,注册属性等觉得稍显麻烦,貌似还带了缓存OMG,本来就已经够晕了,这样写更晕。我一般修改成很简单的方式。
4.其它
几个小的细节,我自己开始出错的地方:
A.TestFieldEditor.ascx里面有个ID,应该与TestFieldControl.cs里的对应,这样才可以用FindControl来找控件。
B.在xml里只定义TestFieldProEditor.ascx的位置,TestFieldEditor必须放在指定文件夹了,且似乎文件名随便起。(没看到哪里有指定这个对应关系的)
C.如果要做带属性的FieldType,必须在xml里也把属性定义出来!虽然我实在想不通这两者有什么关联 :(
但不定出来就会出现值存不起去的情况。
5.RenderParten
可能有点复杂,我一直没怎么写。就直接Render了。
另外可以publish一些属性给外面调用此控件使用,也可以做到更多的自定义。
6.自定义属性的一个Bug
新建的时候自定义属性不能保存值,但Update时则能保存结果。
处理此Bug的方法WSPBuilder自动生成的代码能应对。
参见另一篇日志:
About sharepoint custom FieldType bug
http://www.cnblogs.com/nonlyli/archive/2008/06/01/1211669.html
参考:
1.创建MOSS2007自定义字段类型实例 (写得简单易懂)
2.自定义列表字段类型(1)(2)(3) (可惜还是未完待续)
3.Creating Custom Field Types with a FieldEditorUserControl (attached sample below)
(详细,且针对Custom Properties)