自定义字段类型在SharePoint 2007的时代出现,一举弥补了很多应用中的不足,很久之前也写过一篇关于用自定义字段类型拼装应用的Blog:《将SharePoint提升为应用开发平台》(之前Blog上的图都没了,某天突然有人告诉我说这篇文章被放到MSDN上了,汗……)
在SharePoint 2010中,自定义字段类型的开发大致没什么变化(我还没有测试过那个非常恶心的自定义字段类型的自定义属性的自定义设置画面的保存问题,在2010里面有没有得到改善,有时间试一下……)。但是在处理显示的时候,和2007相比有了很大的变化。
众所周知,2010中列表视图的默认WebPart已经从LVWP(ListViewWebPart)换成了XsltListViewWebPart,因此在默认情况下所有字段在视图中的显示,都是通过XSLT来渲染的。因此,当我们把一个2007里面写好的自定义字段类型部署到2010上的时候,会发现在fldtypes_***.xml中写的那些DisplayPattern和HeaderPattern都不生效了。
这里面有两个处理方法:
方法一:让CAML渲染重新生效,只需要在那个xml文件中加入如下一行就行:
1: <Field Name="CAMLRendering">TRUE</Field>
方法二:使用新的xslt渲染机制。
在14\TEMPLATES\LAYOUTS\XSL目录中,创建一个fldtypes_***.xsl文件,将字段的视图渲染放进去(SharePoint默认的那些字段渲染样式就是该目录中的FLDTYPES.xsl文件,可以作为编写时的参考),建立形如下面的这种内容:
1: <?xml version="1.0" encoding="utf-8"?>
2: <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
3: xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
4: version="1.0"
5: exclude-result-prefixes="xsl msxsl ddwrt"
6: xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
7: xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
8: xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
9: xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
10: xmlns:msxsl="urn:schemas-microsoft-com:xslt"
11: xmlns:SharePoint="Microsoft.SharePoint.WebControls"
12: xmlns:ddwrt2="urn:frontpage:internal">
13: <xsl:template match="FieldRef[@FieldType='CustomField']" mode="Note_body">
14: <xsl:param name="thisNode" select="." />
15: <xsl:value-of select="$thisNode/@*[name()=current()/@Name]"
16: disable-output-escaping="yes" />
17: </xsl:template>
18: </xsl:stylesheet>
19:
20:
SharePoint是通过其中的下面这一行来匹配字段的:
1: <xsl:template match="FieldRef[@FieldType='CustomField']" mode="Note_body">
match属性决定了字段的匹配规则,上图中是使用FieldType,也就是字段类型来进行匹配,这个值和在fldtypes_***.xml中定义的TypeName的值是要保持一致的。除此之外,这里也可以使用字段名称来进行匹配,例如:
1: <xsl:template match="FieldRef[@Name='MyField']" mode="Note_body">
来匹配所有内部名称为“MyField”的那些字段,后面的mode是字段显示的基础样式类型,可以参考FLDTYPES.xsl中的内容。
在SharePoint 2007中,DisplayPattern除了能够控制视图的显示样式之外,还可以控制在字段查看状态下(比如列表条目查看页面DispForm.aspx)中的样式。但是到了2010里面,不论是DisplayPattern还是xslt,都只能够控制视图中的显示样式,而控件查看状态下的样式,必须通过字段的控件来进行定义——这样也造成了2007的时候,控件和CAML都可以定义查看样式的冲突。
BTW,其实我不太会写xslt,本来想用CAML就完了,结果发现在继承多行文本(SPFieldMultiLineText)的时候,html死活显示不出来,一直都被编码,google许久没找到原因,最后只好上了xslt的贼船,有时间需要系统的学一下xslt了……
一些参考文章:
1、How to: Customize the Rendering of a Field on a List View