SharePoint Lists are a versatile artifact in SharePoint. It can be mend in any way possible to achieve the desired outcome. This is the reason to use List for all the help desk applications. Recently I had to build a helpdesk application but the client wanted to use plain vanilla SharePoint and wanted to avoid custom code and wanted to keep it to bare minimum. Building a simple helpdesk with List and no code is relatively straight forward but the catch here is they already had created a basic structure where they are using a list to collect the information from external users and the information is getting copied to a new list for internal users. This is done to implement separation of permission as mentioned earlier there is no code approach. This is in their POC environment.
Now they wanted to move to production.Implementation is done as follows
1. They are using attachments in the list to get relevant reference documents form external users.
2. Workflow is been used for copying item from one list to other.
The problem that they are facing is attachments are not getting copied. This is interesting because attachments in SharePoint lists are a linked item and is not part of the SharePoint fields. This is what is causing the workflow not to copy the attachment. Also there is no workflow activity that can copy attachment.
The way to solve this problem would be to
1. Create a custom Copy List Item activity with extended functionality to look for attachment and copy it.
2. Customize the List form with Infopath forms and make the attachment to be part of the list item (This I saw working but still could not comprehend why it works.)
3. Write a small event handler (Item Added and Updated(if you are allowing delayed submission) and copy the attachment.
We went with third option and reason for that being though we had to write code we could do it on a Sandboxed solution rather than a Farm solution which would be the case for option 1. Option 2 is ruled out because the client did not like infopath forms. Its good because we now know Infopath form is dead you can read this here)
There is another thing the remember with List Item attachments. Since List Item Attachments are stored as collection when you access them in code and these are collection of strings rather than a file. so we have to user getfile method to get the file and add it. Similarly adding an attachment do not need item update as it linked item.
Client is on SP 2010 and I had not an opportunity to try this out in Client Side Object Model (CSOM or JSOM) which I am planning so that it becomes easy for SP2013 but will update this post after trying with SCOM/JSOM code.
Code :
foreach (string fileName in requestItem.Attachments)
{
SPFile file =requests.ParentWeb.GetFile(requestItem.Attachments.UrlPrefix + fileName);
properties.ListItem.Attachments.AddNow(file.Name, file.OpenBinary());
}
Now they wanted to move to production.Implementation is done as follows
1. They are using attachments in the list to get relevant reference documents form external users.
2. Workflow is been used for copying item from one list to other.
The problem that they are facing is attachments are not getting copied. This is interesting because attachments in SharePoint lists are a linked item and is not part of the SharePoint fields. This is what is causing the workflow not to copy the attachment. Also there is no workflow activity that can copy attachment.
The way to solve this problem would be to
1. Create a custom Copy List Item activity with extended functionality to look for attachment and copy it.
2. Customize the List form with Infopath forms and make the attachment to be part of the list item (This I saw working but still could not comprehend why it works.)
3. Write a small event handler (Item Added and Updated(if you are allowing delayed submission) and copy the attachment.
We went with third option and reason for that being though we had to write code we could do it on a Sandboxed solution rather than a Farm solution which would be the case for option 1. Option 2 is ruled out because the client did not like infopath forms. Its good because we now know Infopath form is dead you can read this here)
There is another thing the remember with List Item attachments. Since List Item Attachments are stored as collection when you access them in code and these are collection of strings rather than a file. so we have to user getfile method to get the file and add it. Similarly adding an attachment do not need item update as it linked item.
Client is on SP 2010 and I had not an opportunity to try this out in Client Side Object Model (CSOM or JSOM) which I am planning so that it becomes easy for SP2013 but will update this post after trying with SCOM/JSOM code.
Code :
foreach (string fileName in requestItem.Attachments)
{
SPFile file =requests.ParentWeb.GetFile(requestItem.Attachments.UrlPrefix + fileName);
properties.ListItem.Attachments.AddNow(file.Name, file.OpenBinary());
}