我对内容类型及其ID以及如何将它们与对象模型一起使用有疑问。
首先,我定义了一些网站列,使用这些列的内容类型以及通过CAML使用此内容类型的列表定义。三个组件中的每一个都被实现为特征。另一个功能是创建此列表定义的列表实例。
因此,当我尝试使用我的内容类型向列表中添加新项目时,我使用以下代码。
SPListItem listItem = list.Items.Add();
SPContentType type = list.ContentTypes[new ContentTypeId("0x010044fb4458c2eb4800825910845a35554c")];
listItem["ContentTypeId"] = type.Id;
listItem["Title"] = "Titel";
listItem.Update();
当我执行这段代码时,类型对象仍为null,我也确定内容类型已附加到列表中。调试代码并检查列表的内容类型向我显示附加到列表的内容类型没有我在内容类型定义(CAML)中定义的id。列表实例中的id不同,但是从我在内容类型定义中定义的id开始。 的 0x010044FB4458C2EB4800825910845A35554C 0077D683BDD9969F4E920A27C334463321
这种行为正常吗?我希望附加到列表的内容类型具有与定义中相同的ID。
我的主要目标是避免使用内容类型的名称从列表的内容类型中检索它,但要使用唯一的ID。
再见 FLO
答案 0 :(得分:5)
当您根据内容类型创建列表时,列表的每个实例实际上都是从父级继承的新内容类型。
看看这个...... http://soerennielsen.wordpress.com/2007/09/11/propagate-site-content-types-to-list-content-types/
更新 - 关于在不使用名称的情况下查找List实例,请同时查看SPContentTypeUsage类!
答案 1 :(得分:1)
不要过分强调将内容类型的名称编码为代码中的常量。虽然乍一看似乎可以更改内容类型的名称,但它应该被视为常量,因为更改内容类型名称的含义非常重要,足以要求完整构建和重新发布您的解决方案,允许更改编码常量。
答案 2 :(得分:1)
列表中的ContentTypeID是ContentTypeID +列表ID。
以下代码可以解决这个问题:
//i try and keep these in a string constants class to avoid
//having to manage "magic strings" throughout my solution
SPContentTypeID ctid = new ContentTypeId("0x010044fb4458c2eb4800825910845a35554c");
//here's the magic
SPContentTypeID listCTID = list.ContentTypes.BestMatch(ctid);
//retrieve the ContentType with the appropriate ID
SPContentType type = list.ContentTypes[listCTID];
//do your thing
SPListItem listItem = list.Items.Add();
listItem["ContentTypeId"] = type.Id;
listItem["Title"] = "Titel";
listItem.Update();