将查找字段添加到sharepoint中的内容类型

时间:2009-08-18 16:35:19

标签: sharepoint content-type lookup-field

如何使用xml定义向sharepoint中的内容类型添加查找字段? (我收到错误)。

注意事项: - 将内容类型添加到文档库时,将存在查找列表。 - 查找列表将始终具有相同的名称。 - 查找列表名称中有一个空格。

这是我添加到xml中的内容:

  <Field ID="{GUID}"
         Type="Lookup"
         List="$Resources:core,lists_Folder;/List%20Name"
         ShowField="Title"
         Name="MyLookupFieldName"
         DisplayName="MyLookupFieldName"
         StaticName="MyLookupFieldName"
         Hidden="FALSE"
         Required="FALSE"
         Sealed="TRUE"
         >

当我以编程方式将内容类型添加到文档库时,我得到一个异常(没有有​​用的信息),并将以下内容记录到sharepoint日志中:

08/18/2009 17:13:39.50 w3wp.exe(0x08B8)0x11B0 Windows SharePoint Services数据库6f8g意外的意外查询执行失败,错误代码8114.下面包含SQL Server的其他错误信息。 “将数据类型nvarchar转换为uniqueidentifier时出错。”查询文本(如果可用):“{?= call proc_GetListMetaDataAndEventReceivers(?,?,?,?,?,?)}”

3 个答案:

答案 0 :(得分:9)

幸运的是,在SharePoint 2010中,您可以通过设置所有必需的属性来声明性地执行此操作,如以下工作示例所示。

<Field Type="Lookup" DisplayName="Link Type" Description="Represents link type." 
Required="TRUE" EnforceUniqueValues="FALSE" List="Lists/Links Types" WebId="~sitecollection" 
Overwrite="TRUE" PrependId="TRUE" ShowField="Title" UnlimitedLengthInDocumentLibrary="FALSE" 
Group="Research Links Columns" ID="{a15e9fa2-4ea0-41f1-a583-b21d53cf72d3}" 
SourceID="{30650f6f-fbb8-4acc-a935-29745f5d3c59}" StaticName="Link_x0020_Type" 
Name="Link_x0020_Type" Hidden="FALSE" ReadOnly="FALSE"></Field>

将WebId设置为具有“〜sitecollection”值并将Overwrite设置为TRUE非常重要。
More info

答案 1 :(得分:2)

问题是你需要引用列表的GUID而不是它的标题。由于您可能不知道列表的GUID,因此您不能在不执行某些自定义代码的情况下执行此操作。

即使你没有使用VSeWSS,post dahlbyk的最后几个步骤也链接到了如何执行此操作。如果您不使用VSeWSS,Chris O'Brien已经遇到了制作CodePlex project以帮助您的麻烦。

答案 2 :(得分:1)

好的,所以由于某种原因,我无法获取内容类型的字段的xml定义。我确实在代码中找到了如何做到这一点。对我有用的解决方案是不在xml中添加Field定义,而是将其添加到代码中:

  • 将内容类型添加到列表中(在网站定义代码中,或在任何地方)。
  • 向给定的SPWeb添加字段查找(因此该字段是网络字段,而不是网站字段)
  • 向列表内容类型添加新的字段链接。
  • 更新内容类型。

例如:

SPContentType myContentType = myWeb.Site.RootWeb.ContentTypes["MyContentType "];
myLib.ContentTypes.Add(myContentType);

myContentType = myLib.ContentTypes["MyContentType "];

myWeb.Fields.AddLookup("MyLookupFieldName", myWeb.Lists["MyLookupListName"].ID, false);
SPFieldLink myFIeldLink = new SPFieldLink(myWeb.Fields["MyLookupFieldName"]);
myContentType.FieldLinks.Add(myFIeldLink);
myContentType.Update();