четверг, 27 марта 2014 г.

Как проверить существует ли объект (список, поле и т.п.) на сайте SharePoint

В Sharepoint почему-то все не однозначно устроено на предмет получения информации о наличии того или иного элемента.

Самый очевидный и простой способ - это типы контента. Достаточно сделать вот так:
  var myType = web.AvailableContentTypes["Special Document"];
  if (myType!=null) //тип контента существует

На этом простое заканчивается. О существовании списка уже так не узнаешь. Если списка нет, то подобная конструкция вызовет исключение. И, обертывание доступа к списку в try-catch, в общем-то, единственный способ узнать о том, что списка на сайте нет и не уронить приложение. Так что, рекомендую написать примерно такой метод расширения и использовать при необходимости его.
    public static bool ListExists(this SPWeb web, string listName)
    {
       try
       {
          var list = web.Lists[listName];
          return true;
       }
       catch
       {
           return false;
       }            
    }
Ну а самое интересное с полями. Представьте, что вы создали вот такое поле:



   string internal_Name = web.Fields.Add("UserReference", SPFieldType.User, false);
   SPFieldUser usrRef = (SPFieldUser)web.Fields.GetFieldByInternalName(internal_Name);
   usrRef.Title = "Ссылка на пользователя";
   usrRef.Update();

Как проверить что оно есть в списке? Вот так нельзя, если поля в списке нет, то вы получите исключение.
   
   SPListItem itm = list.Items[0];
   SPField field = itm.Fields["Ссылка на пользователя"];

К тому же, в такую конструкцию нужно передавать DisplayName, которое у поля, например, AssignedTo не только разное в версиях на разных языках, но его еще и можно спокойно поменять. Можно сделать одним из двух способов:
   //сюда можно передавать как внутренне имя, так и DiaplayName
   SPField field = list.Fields.GetField("UserReference");

   //а сюда, как следует из названия - только внутреннее имя.
   SPField field = list.Fields.GetFieldByInternalName("UserReference");

Правда, в любом из них вы также получите исключение, если в список нет такой колонки. Так что, и в этом случае придется создавать метод расширения. Но, получив объект поля вы не сможете получить его значение. Значение можно получить только через itm.Fields зная правильный DisplayName. Так что, от метода расширения нам нужно знать не только существует ли колонка, то и получать Display Name. И использовать его как-то так:
    public static string GetFieldDisplayName(this SPList list, string columnName)
    {
       try
       {
          SPField field = list.Fields.GetField("UserReference"
          return field.Title;
       }
       catch
       {
           return null;
       }            
    }

    string fieldDisplayName = list.GetFieldDisplayName("UserReference");
    if (fieldDisplayName!=null) result=itm[fieldDisplayName].ToString();


Комментариев нет:

Отправить комментарий