How to create custom
Document ID in SharePoint 2010
Download project at here
In this article we
will be seeing how to create custom Document ID provider in SharePoint 2010.
Here we are going to see how to create a custom Document ID provider in the format "Site Name . List Name . List item ID".
Here we are going to see how to create a custom Document ID provider in the format "Site Name . List Name . List item ID".
Open Visual Studio
2010.
Go to File => New
=> Project.
Select Empty
SharePoint Project template from the installed templates.
Enter the Name “MsTechSharingCudtomDocumentID”
and click Ok.
Deploy as farm …
Right click on the
solution and click on Add a new item.
Select the Class
template from the installed template.
Enter the Name as MSTechSharingCustomID.cs
and click Ok.
Add the following
references.
Microsoft.Office.DocumentManagement.dll
Add the following
namespaces.
Using Microsoft.SharePoint;
Using
Microsoft.Office.DocumentManagement;
Replace
the MSTechSharingCustomID.cs with the following code.
using System;
using System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
Microsoft.SharePoint;
using
Microsoft.Office.DocumentManagement;
namespace
MsTechSharingCudtomDocumentID
{
public class CustomIDProvider
: DocumentIdProvider
{
private string idFormat = "{0}
. {1}. {2}";
public override string[]
GetDocumentUrlsById(SPSite site, string documentId)
{
string
itemUrl = string.Empty;
// Only proceed if we have the site and document id
if (site
!= null && !string.IsNullOrEmpty(documentId))
{
string[]
splits = documentId.Split('@', ' ');
string
webName = splits.Length > 0 ? splits[0] : null;
string
itemId = splits.Length > 1 ? splits[1] : null;
try
{
SPWeb
web = string.IsNullOrEmpty(webName) ?
site.OpenWeb() : site.OpenWeb(webName);
SPListItem
item = null;
Guid
itemGuid = new Guid(itemId);
// Find the item among the lists on the specified web
foreach (SPList list in
web.Lists)
{
try
{
item
= list.Items[itemGuid];
}
catch
{
//if it's not in this list, go to the next one
continue;
}
if (item
!= null)
{
itemUrl
= web.Url + "/";
itemUrl
+= item.Url;
}
}
}
catch (Exception) { /* item not
found, return an empty array*/ }
}
if (string.IsNullOrEmpty(itemUrl))
{
return null;
}
else
{
return new string[] {
itemUrl };
}
}
public override string
GenerateDocumentId(SPListItem listItem)
{
if
(listItem == null)
{
throw new ArgumentNullException("listItem");
}
return string.Format(this.idFormat,
listItem.Web.Title, listItem.ParentList.Title, listItem.ID.ToString());
}
public override string
GetSampleDocumentIdText(SPSite site)
{
return string.Format(this.idFormat,
"/", "0");
}
public override bool
DoCustomSearchBeforeDefaultSearch
{
get { return false; }
}
}
}
Rename the feature as
MSTechSharingCustomIDReciever.
Change scope to site
Now the entire
solution looks like following.
Replace CustomIDProviderReciever.EventReceiver.cs
with the following code.
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.Office.DocumentManagement;
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.Office.DocumentManagement;
namespace
DocumentIDProvider.Features.CustomIDProviderReciever
{
[Guid("e806be7b-a8e1-40a9-ab9a-037e2eb522c9")]
public class CustomIDProviderRecieverEventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
DocumentId.SetProvider(properties.Feature.Parent as SPSite, new CustomIDProvider());
}
{
[Guid("e806be7b-a8e1-40a9-ab9a-037e2eb522c9")]
public class CustomIDProviderRecieverEventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
DocumentId.SetProvider(properties.Feature.Parent as SPSite, new CustomIDProvider());
}
public override void
FeatureDeactivating(SPFeatureReceiverProperties properties)
{
DocumentId.SetDefaultProvider(properties.Feature.Parent as SPSite);
}
}
}
{
DocumentId.SetDefaultProvider(properties.Feature.Parent as SPSite);
}
}
}
Build and deploy the
solution.
Go to the site where
you have deployed the solution.
Note: three below steps you aren't need do because it only configure and use Document IDS no code
////////////////////////////
////////////////////////////
////////////////////////////
////////////////////////////
////////////////////////////
Go to Site Actions
=> Site Collection Administration => Site collection features => click
Active “Document ID Service”
Go to Site Actions
=> Site Collection Administration => Document ID settings
then input IDS
//////////////////////////// //////////////////////////// //////////////////////////// //////////////////////////// ////////////////////////////
Add a document and
check the document ID. You see document ID have not appeared (if error)
How to Solve:
Go to Central Admin =>
Monitoring => Timer Jobs => Click to “Check job status” link, then find
to “Document ID enable/disable job” at “Scheduled” and
click to “Document ID enable/disable job” with site which you have
deployed the solution.
You see timer job have not ran
Change schedule to minutes: 5 then
click Run Now
Continue Go to Central Admin =>
Monitoring => Timer Jobs => Click to “Review job definitions” link
Click to “Document
ID assignment job” link
Change schedule to minutes: 5 then
click Run Now
You see have 2 services follow
Minutes
Waiting 5 minutes: you see
Document ID appear on view
Create new document or upload
document again and see document ID with: "Site Name .
List Name . List item ID".
Finding this article stopped me from pulling my hair out, specifically the part concerning "create new document". Just wanted to thank you, great article!
ReplyDelete