Skip to content

Related items field – how to access it programmatically by code?

March 22, 2015

When paying with new Workflow tasks I have noticed that they now do contain the new field of type “related items”.

This is an awesome field that allows you to add links to any items from your site collection.

By default this field exists in a new content type called Workflow Task (SharePoint 2013).

So what happens when a SharePoint 2013 workflow creates a task for an item? It fills a link to an original item that workflow has to do with in this field.

Her is how it looks like.


If you press Add related item, then

You see a nice dialog that allows you to open any item from your site collection.


Once a customer asked me to do the following logic. Once a task has been updated by someone, add comments and the guy who actually implemented the task to the original item.

So I came to a problem – how do I actually read the related items and find out what is inside?

When I looked at the fields I figured out it is actually a multiline text field


So when I wrote a short program that actually gets the value and I was surprised to see it is actually JSON!


Or in JSON.


So basically you need to add a simple parser that will read the values.

I have tried a parser which I found out in ASP.NET MVC4 but apparently it needed a couple of DLLS to be installed which we could not figure out, so I have used a NewtonSoft JSON which was added with a simple nuget package.

So the code of reading the values from related items is

using (ClientContext ctx = GetAuthenticatedContext())

{

TraceHelper.TraceInformation(ConsoleColor.Magenta, “reading related items”);

ctx.Load(ctx.Web, x=>x.ServerRelativeUrl);

ctx.ExecuteQuery();

var workflowTasksListUrl = UrlUtility.CombineUrl(ctx.Web.ServerRelativeUrl, Lists.WorkflowTasks.GetListUrl());

var workflowTasksLIst = ctx.Web.GetList(workflowTasksListUrl);

// this is just for demo, this is not the best code to work with sharpeoint items

var items = workflowTasksLIst.GetItems(

new CamlQuery()

);

ctx.Load(items);

ctx.ExecuteQuery();

string relatedItemsString = (string)items[0][BuiltInInternalFieldNames.RelatedItems];

dynamic decodedRelatedItems = JsonConvert.DeserializeObject(relatedItemsString);

foreach (var item in decodedRelatedItems)

{

int itemId = int.Parse(item.ItemId.ToString());

var listId = new Guid(string.Format(“{{{0}}}”, item.ListId.ToString()));

var webId = new Guid(string.Format(“{{{0}}}”, item.WebId.ToString()));

Console.WriteLine(“Found an item from web {0}, list {1}, itemid:{2}”,webId,listId,itemId);

}

And can be found in a demo app called “DemoAp.Reader”.

Before you can use it run DemoApp.AssetBuilder that uses spmeta2 for provisioning and builds a structure.

Source code can be found at

https://github.com/maratbakirov/2015_03_related_fieldsDemo

Advertisements

From → Sharepoint

Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: