SharePoint 的栏,有3个名字, StaticName InternalName DisplayName。 当在第一次创建栏的时候,这3个名字一起进行创建,并且都一样。
<FIELD id="{ e22e955b-4125-44ae-80f5-29965496802e}" name="NameTest" rowordinal="0" colname="nvarchar4" staticname="NameTest" sourceid="{bd9a3dc5-63ef-4f7c-a85f-acff55 f95e09}" maxlength="255" required="FALSE" displayname="NameTest" type="Text"></FIELD><PRE></PRE>
上面是filed 的 SchemaXml, name 为InternalName,下同。
当我们修改了栏名之后,会发现,只有displayname发生改变,其他的2个都没有发生变化。
<FIELD id="{e22e 955b-4125-44ae-80f5-29965496802e}" name="NameTest" rowordinal="0" colname="nvarchar4" staticname="NameTest" sourceid="{bd9a3dc5-63ef-4f7c-a85f-acff55f95e 09}" maxlength="255" required="FALSE" displayname="Test" type="Text" version="1" emode="" im=""><DEFAULT></DEFAULT></FIELD><PRE></PRE>
当我们输入中文的时候,发现情况有变,在第一次创建之后,3个名字也一起进行创建,但是StaticName 和 InternalName是一样的,显示的是一个字符串 。DisplayName 显示为中文。
<FIELD id={b02dedce-3be9-4afb-b046-699914386cf7} name="_x5f00__x59cb__x65f6__x95f4_" rowordinal="0" colname="datetime1" staticname="_x5f00__x59cb__x65f6__x95f4_" sourceid="{bd9a3 dc5-63ef-4f7c-a85f-acff55f95e09}" required="FALSE" displayname="开始时间" type="DateTime" version="1" imemode="inactive" format="DateOnly"></FIELD><PRE></PRE>
当我们修改栏名之后,情况和前面的一样,StaticName 和 InternalName 不变 ,DisplayName发生 变化。
在我们使用对象模型的时候,对使用的那个 Name其实并不清楚 ,下面是总结的一些经常使用的方法和所用的name:
-
SPFieldCollection[name] : SPField
name: DisplayName
unexistent: exception -
SPFieldCollection.GetField(name): SPField
name: internalName, displayName or internalName and displayName from the current context
unexistent: exception -
SPFieldCollection.GetFieldByInternalName(name): SPField
name: internalName
unexistent: exception -
SPFieldCollection.ContainsField(name): bool
name: displayName or internalName
unexistent: boolean -
SPListItem[name]: object
name: internalName, displayName or internalName and displayName from the current context
unexistent: null -
SPListItem.GetFormattedValue(name): string
name: internalName, displayName or internalName and displayName from the current context
unexistent: exception
ps:上面用 internalName的地方一样能使用staticName, 因为2个的值一直都是一样的。
在我们通过SPQuery对list做查询的时候,我们就会发现中文栏,使用displayname查询就会出现异常,如果使用internalName就没有什么问题。
我们可以把internalName理解为存放在数据库中的字段名,DisplayName为在页面进行显示的名称。