Compartilhar via


Programmatically Create a Managed Metadata List Column (Mohammed Faizan)

Managed metadata is a hierarchical collection of centrally managed terms that you can define, and then use as attributes for items in Microsoft SharePoint Server 2010. Refer here for more information on the managed metadata in SharePoint 2010.

A column is a location in a list in which to store information about a SharePoint Server 2010 item. When you define a column, you provide a name for the column, specify the column's type, and provide additional information that depends on the column type.

SharePoint Server 2010 introduces a new column type named managed metadata. When you create a managed metadata column, you specify the term set from which the column's values must come. When you want users to provide information for list items (including documents), and the valid values for the information are contained in a term set, use a managed metadata column. Create a new content type or modify an existing content type, and then add the managed metadata column to the content type.

This post describes the way of programmatically creating a managed metadata taxonomy column and adding the column to a custom content type.

In this article, you:

  1. Create a SharePoint 2010 project
  2. Add a feature and feature receiver
  3. Add code to create a managed metadata site column and then add the site column to a custom content type
  4. Deploy the solution to SharePoint 2010

The code in this topic creates a TaxonomyField class which was introduced in SharePoint 2010. The TaxonomyField class is a custom field class that inherits from the SPFieldLookUp class. Refer here for more on the TaxonomyField class.

Programmatically Create the Managed Metadata Column

The following steps deploy the code to SharePoint 2010 as a feature receiver that programmatically creates the managed metadata column. The procedures in this section assume a development environment where SharePoint 2010 is installed and configured, Microsoft Visual Studio 2010 is installed, and the currently logged-in user has administrative rights on the SharePoint environment for deployment purposes.

Before you begin, ensure that you have the Managed Metadata service provisioned and Term sets and terms created. Figure 1 shows the terms set and terms.

Figure 1. Term set and terms

Figure01

1. In Visual Studio 2010, click New Project, expand the SharePoint node, click 2010, and then click Empty SharePoint Project. Provide name for the project.

2. In the SharePoint Customization Wizard, select the local SharePoint site that will be used for debugging. Select the Deploy as a farm solution option and then click Finish.

Note: Creating a TaxonomyField class requires a reference to the Microsoft.SharePoint.Taxonomy.dll. This .dll is not available in a sandbox solution and therefore the solution will have to be deployed as a farm solution.

3. In Solution Explorer, right-click the Features node, and then click Add Feature as shown in Figure 2.

Figure 2. Add the feature

Figure02

4. Name the feature AddMMSColumn and add a description as shown in Figure 3. Change the Scope to Site.

Figure 3. Define the feature

Figure03

5. Right click the AddMMSColumn feature node and then click Add Event Receiver. (see Figure 4).

Figure 4. Add an event receiver

Figure04

6. Add the following code in the feature receiver’s FeatureActivated event.

public override void FeatureActivated(SPFeatureReceiverProperties properties)

{

   const string TermStoreName = "Managed Metadata Service";

   const string GroupName = "Office Locations";

   const string TermSetName = "Europe";

   const string SPLocationListColumn = "OfficeLocation";

   const string ContentTypeOfficeDetails = "Office Details";

   //Get the Taxonomy session for current SPSite

   TaxonomySession session = new TaxonomySession(SPContext.Current.Site);

   if (session.TermStores.Count != 0)

   {

      using (SPSite site = (SPSite)properties.Feature.Parent)

      {

         SPWeb rootweb = site.RootWeb;

         var termStore = session.TermStores[TermStoreName];

         var group = from g in termStore.Groups where g.Name == GroupName select g;

         var termSet = group.FirstOrDefault().TermSets[TermSetName];

         //Get the content type to which the taxonomy field is to be added

         SPContentType contentTypeOfficeDetails = rootweb.ContentTypes[ContentTypeOfficeDetails];

         //Check if field exists, if yes take no action

         bool fieldExists = rootweb.Fields.ContainsField(SPLocationListColumn);

         if (!fieldExists)

         {

            //Create a new TaxonomyField

            TaxonomyField field = rootweb.Fields.CreateNewField("TaxonomyFieldType", SPLocationListColumn) as TaxonomyField;

            field.SspId = termSet.TermStore.Id;

            field.TermSetId = termSet.Id;

            field.TargetTemplate = string.Empty;

            field.AllowMultipleValues = true;

            field.CreateValuesInEditForm = true;

            field.Open = true;

            field.AnchorId = Guid.Empty;

            field.Group = "Taxonomy Fields";

            //Add the taxonomy field to site columns

            rootweb.Fields.Add(field);

            rootweb.Update();

            TaxonomyField fieldAdded = rootweb.Fields[SPLocationListColumn] as TaxonomyField;

            //Add the field to the a custom content type

            SPFieldLink fieldLnkArticle = new SPFieldLink(fieldAdded);

            contentTypeOfficeDetails.FieldLinks.Add(fieldLnkArticle);

            contentTypeOfficeDetails.Update(true);

         }

      }

}

7.  Right click the project name in Visual Studio and then click Deploy as shown in Figure 5.

Figure 5. Deploy the solution

Figure05

8.  Navigate to the site where the feature is activated. Click Site Settings and then click Site columns. The newly created column is visible in the Taxonomy Fields group as shown in Figure 6.

Figure 6. The newly create column

Figure06

9.  Click the column name to go to the Edit page of the column. The term set that was specified in the code should be selected as shown in Figure 7.

Figure 7. The highlighted term set

Figure07

10. Click Site Settings and then click Site content types. Click the content type to which the column was added. The column is visible in the Manage content type page of the selected content type (see Figure 8).

Figure 8. The new column

Figure08

You can start using this content type or the column in your lists and libraries.

Technorati Tags: Managed Metadata columns,Mohammed Faizan

Comments

  • Anonymous
    April 16, 2012
    Hi, This code will fail if you activate this feature from PowerShell for example where there is no context //Get the Taxonomy session for current SPSite   TaxonomySession session = new TaxonomySession(SPContext.Current.Site); I think it should be like that: TaxonomySession session = new TaxonomySession((SPSite)properties.Feature.Parent);

  • Anonymous
    May 04, 2012
    Hi, The project worked when I added this also. using System.Linq;

  • Anonymous
    June 06, 2012
    Free Taxonomy Editor For SharePoint offers a designer to create/edit/translate taxonomies in Visual Studio visualstudiogallery.msdn.microsoft.com/6376118f-c5ad-41a7-a6e7-2a53c19bf6c3

  • Anonymous
    July 20, 2013
    This code has memory leak, you never dispose an object which is initiated by somebody else. Disposing the SPSite is wrong!

  • Anonymous
    September 04, 2013
    Hi Mohammed, Do you know of any guidance for provisioning managed metadata term sets and managed metadata site columns to the content type hub in an O365 SharePoint instance?   Thanks, Mike

  • Anonymous
    October 16, 2013
    programsharepoint.blogspot.com/.../create-managed-metadata-field-using.html

  • Anonymous
    December 10, 2013
    Error 1 Error occurred in deployment step 'Activate Features': Object reference not set to an instance of an object.