Я схожу с ума, пытаясь заставить работать приемник событий списка SharePoint. Я создал проект EventReceiver в VS и могу его отлаживать, однако точки останова не работают. По сути, это та же проблема, с которой сталкивались многие люди, но ни одно из их решений, похоже, не работает. Я публиковал это раньше и думаю, что мой код приемника событий должен работать, но я не могу заставить его работать с самим списком. (мой код вставлен ниже)
По сути, все, что мне нужно, - это переименовать получатель событий загружаемый документ. Рассмотрим этот сценарий, если загруженный документ называется Client A Document и является первым документом, он должен называться Client A Document 1. Если следующий загруженный документ называется Client A Document, его следует переименовать в Client A Document 2 и т. Д. . Теперь, если загружен другой документ с именем Client B Document, это должен быть только Client B Document 1, поскольку других с таким же именем нет. Теперь я думаю, что мой код ниже выполняет это поведение (код был написан благодаря помощи Роберта Кристса!), Но я не знаю, как это проверить.
Я загружаю документ или создаю новый? Я пробовал оба, и ничего не работает, у кого-нибудь есть идеи, как это сделать? Я начинаю терять рассудок от этого требования.
public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
SPListItem item = properties.ListItem;
if (item == null || item["Name"] == null) //item["Name"] == null)
return; //or better yet, log
string oldFileName = item["Name"].ToString();
int positionOfPeriod = oldFileName.LastIndexOf(".");
string tempFileName = oldFileName.Substring(0, positionOfPeriod);
SPQuery query = BuildArbitraryQuery(properties.List, "Name", tempFileName, true);
int count = properties.List.GetItems(query).Count;
String fileName, fileExtension;
if (positionOfPeriod == -1)
{
fileName = oldFileName;
fileExtension = "";
}
else
{
fileName = oldFileName.Substring(0, positionOfPeriod);
fileExtension = oldFileName.Substring(positionOfPeriod);
}
string newFileName = fileName + "-xx" + count.ToString() + fileExtension;
item["Name"] = newFileName;
Console.WriteLine("New File Name: " + newFileName);
try
{
properties.Web.AllowUnsafeUpdates = true;
EventFiringEnabled = false;
item.Update();
}
finally
{
properties.Web.AllowUnsafeUpdates = false;
EventFiringEnabled = true;
}
}
/// <summary>
/// Builds an arbitrary SPQuery which filters by a single column value.
/// </summary>
/// <param name="list">The list you will run the query against.</param>
/// <param name="columnDisplayName">The Display Name of the column you want to filter.</param>
/// <param name="value">The value to filter against.</param>
/// <returns>A new SPQuery object ready to run against the list.</returns>
public static SPQuery BuildArbitraryQuery(SPList list, string columnDocumentName, string value, bool deepSearch)
{
if (list == null)
throw new ArgumentNullException("You cannot pass a null list to Helper.BuildArbitraryQuery.");
if (!list.Fields.ContainsField(columnDocumentName))
throw new ArgumentException("The SharePoint List \"" + list.Title + "\" does not contain the Field \"" + columnDocumentName + "\".");
string internalName = list.Fields[columnDocumentName].InternalName;
SPQuery query = new SPQuery();
query.Query = "<Where><Eq><FieldRef Name=\"" + internalName + "\"/><Value Type=\"Text\">" + value + "</Value></Eq></Where>";
if (deepSearch)
query.ViewAttributes += "Scope='RecursiveAll'";
return query;
}
РЕДАКТИРОВАТЬ:------------------------------------------------ - Хорошо, поэтому я провел небольшой тест, начатый с того же типа проекта (приемник событий), и создал очень простой метод ItemAdded для изменения имени элемента списка на текущую дату. Теперь это работает с настраиваемым списком, но я не могу заставить это работать с библиотекой документов.
Итак, из этого небольшого теста я знаю, что могу зарегистрировать получателя событий в настраиваемом списке (изолированное решение) с помощью F5 и отладить его, но чем отличаются библиотеки документов? И мой код, который я вставил, не подходит для того, что я пытаюсь сделать в библиотеке документов?
Это код, который я использовал для небольшого теста, но он не работает с библиотеками документов, даже если я создаю новый тип проекта для библиотек документов, а не для настраиваемых списков (это в ItemAdded)
SPListItem currentItem = properties.ListItem;
currentItem["Title"] = DateTime.Now.ToString();
currentItem.Update();