четверг, 5 сентября 2013 г.

Использовать URL дя сортировки и фильтрации в листе

Сортировка
SortField=Title&SortDir=Desc
Если нужно отсортировать по другому полю, необходимо заменить Title на имя требуемого поля. Если вы хотите отсортировать в порядке возрастания, вы должны заменить  Desc  на Asc.

Фильтрация
FilterField1=Writer&FilterValue1=Chris%20Tobey
Лист отобразит элементы только те, у которых Writer = Chris Tobey. Для использования другого поля необходимо также заменить данные на желаемые, как в сортировке. Для фильтрации по нескольким полям необходимо наращивать значения на 1. Например:
FilterField1=Writer&FilterValue1=Chris%20Tobey&FilterField2=Reader&FilterValue2=Djon%20Dow

Мультифильтрация
По аналогии с обычной фильтрацией FilterField1=Writer&FilterValue1=Chris%20Tobey, но вместо FilterField1 необходимо использовать FilterField (без 1 !!!), а вместо FilterValue1 используется FilterMiltiValue= Chris%20Tobey;Jane%20Fabitski. FilterMultiValue не чувчтвительный к регистру “in progress” и “In Progress” вернет одни и тот же результат. FilterMultiValue поддерживает шаблоны поиска – при поиске “task*” найдутся “Task 1”, “Task 2” и т.д.. Фильтры и сортировки можно компоновать ?FilterField1=AssignedTo&FilterValue1=Luis Bonifaz&FilterName=Title&FilterMultiValue=*meeting*&SortField=Title&SortDir=Desc

Как создать SharePoint страницу с анонимным доступом

Иногда нам необходимо дать анонимный доступ к SharePoint странице, при условии что на этом WebApplication не включен анонимный доступ. Мы должны выполнить несколько шагов:

1. Добавить в код страницы - protected override bool AllowAnonymousAccess { get { return true; } }
2. Необходимо наследовать класс не от  LayoutsPageBase, а от UnsecuredLayoutsPageBase. Детальнее MSDN: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.unsecuredlayoutspagebase.aspx
3. Удостоверится что мы не успользуем DynamicMasterPageFile="~/masterurl/default.master", мзменить его надо на MasterPageFile="~/_layouts/simple.master", и ещё  simple.master должен лежать в той же папке что и запрашиваемая анонимная страница 

SPQuery scope

У объекта SPQuery существует область выполнения. Она может быть одной из:
Member name
Description
Default
Показать только файлы и вложенные папки указанной папки.
Recursive
Показать все файлы во всех папках.
RecursiveAll
Показать все файлы и все вложенные папки всех папок
FilesOnly
Показать только файлы из определенной папки.


Для примера, я буду сравнивать результаты запросов с разной областью. В листе есть папки и подпапки. Всего элементов должно быть 561:

string siteUrl = @"http://xxxxxxx&#8221";
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Project Documents"];
     Console.WriteLine("List: " + list.Title);
     Console.WriteLine("ReallyCount: " + list.ItemCount);
     SPQuery spQry = new SPQuery();
     spQry.RowLimit = 300;
     do
     {
           SPListItemCollection items = list.GetItems(spQry);
           Console.WriteLine("FirstQuery: " + items.Count);
           spQry.ListItemCollectionPosition = items.ListItemCollectionPosition;
} while (spQry.ListItemCollectionPosition != null);
     spQry = new SPQuery();
     spQry.ViewAttributes = "Scope=\"RecursiveAll\"";
     spQry.RowLimit = 300;
     do
     {
           SPListItemCollection items = list.GetItems(spQry);
           Console.WriteLine("SecondQuery: " + items.Count);
           spQry.ListItemCollectionPosition = items.ListItemCollectionPosition;
} while (spQry.ListItemCollectionPosition != null);
}
Console.Read();

Результат:

Как вы можете  увидеть  list.ItemCount  показывает что элементов в листе всего 8.  Но установив наиболее часто употребляемое значение области  RecursiveAll я получил 561 элемент в 2 захода. 

Получение следующего ID в списке или библиотеке

Иногда действительно хорошо знать, какой ID элемента будет следующим для листа или библиотеки.  Решение этому я нашел, путем прямого подключения к базе данных контента и выбора колонки "tp_NextAvailableId" в таблице "AllLists" для версии 2007 или "NextAvailableId" в  "AllListsAux" для версии 2010 года..
Запросы будут выглядит так:
2007:  SELECT tp_NextAvailableId FROM AllLists where tp_ID=‘{Id листа}’
2010:  SELECT NextAvailableId FROM AllListsAux where ListID=‘{Id листа}’
Наконец, вы можете использовать это расширение для определания следующего ID для кокретного списка:
///<summary>
///Extension above list which send next available item id 
///</summary>
///<returns></returns>
public static int GetNextAvailableIdFromList(this SPList list, SPSite site)
{
    Guid listId = list.ID;
    int nextAvailableId = -1;
    if (site.WebApplication.ContentDatabases.Count > 0)
    {
        string DBConnString = site.ContentDatabase.DatabaseConnectionString;
        SqlConnection con = new SqlConnection(DBConnString);
        try
        {
           con.Open();
           SqlCommand com = con.CreateCommand();
           com.CommandText = String.Format("SELECT NextAvailableId FROM AllListsAux where ListID=’{0}’",
           listId.ToString());
           nextAvailableId = (int)com.ExecuteScalar();
        }
        finally
        {
           con.Close();
        }
    }
    return nextAvailableId;
}