2010-01-04 2 views
0

Иногда пользователям требуется изменить информацию в элементе списка SharePoint, который не редактируется для них, например, поле, которое скрыто в форме редактирования (в моем случае это был номер записи) ,Поиск элемента списка SharePoint по URL-адресу его формы отображения

Я решил создать небольшое приложение Windows GUI, которое администратор выполнил бы на сервере и внесет требуемое изменение. Тем не менее, самый простой сценарий, чтобы получить экземпляр SPListItem я нашел:

  • администратор вводит URL корневого сайта
  • создается SPSite ojbect, используя данный URL: SPSite oSite=new SPSite(this.txtURL.text);
  • админ вводит относительный URL в сети
  • обязательной для заполнения
  • SPWeb объекта создается в SPWeb oWeb = oSite.OpenWeb(this.txtWebUrl.text);
  • выпадающий список ящик заполнен все названия списка из oWeb.Lists
  • admin выбирает список из списка и вводит идентификатор запрашиваемого элемента;
  • необходимая SPListItem находится как oWeb.Lists[this.lstAllLists.selectedValue].GetItemById(this.txtItemId.value);

Это очень долгий путь, и администраторы не делать ничего, как сделать ввод, нажав и ожидания.
Они хотели бы скопировать URL-адрес формы отображения listitem (из веб-браузера или чей-то электронной почты), вставить его в инструмент обновления, а затем просто нажать «Найти его!».

Мне нужны подсказки, как это можно сделать.

Я знаю, что я мог бы, вероятно, разобрать URL-адрес с регулярным выражением, поскольку он обычно имеет форму http://server/sites/[somesite]/[someweb/somesubweb]/lists/[somelist]/forms/dispform.aspx?ID=[123], но существуют варианты - например, http://[server]/[DocumentLibrary]/Forms/RenamedDispForm.aspx?ID=[1234] имеет совершенно другую структуру, чем первый пример.

Итак, вопрос в том, есть ли какой-нибудь простой способ найти SPListItem по его URL? Реконструкция SPContext из URL-адреса будет отличной.

EDIT: Только что узнал, что можно построить правильный SPSite объект, передавая ему гораздо больше URL:

Dim oSite as New SPSite("http://server/sites/site/Lists/test/DispForm.aspx?ID=136") 

ответ

5

Нашел решение самостоятельно, трюк, который я не знал, заключается в том, что если вы используете длинный URL-адрес в конструкторе SPSite, это дает вам SPWeb объект с «глубоким возможным» адресом, который соответствует своему адресу (как описано здесь: http://msdn.microsoft.com/en-us/library/ms473155.aspx)

Тем не менее, я должен перебрать все списки, чтобы узнать, какой список имеет требуемый URL ,Простая функция, которая делает то, что мне нужно :

UPDATE @ 2012-08-01:

  • не нужно перебрать коллекции списка, есть GetList метод в SPWeb объекта.
  • а не делать регулярное выражение по URL, можно использовать HttpUtility.ParseQueryString метод

Поэтому код теперь выглядит следующим образом:

Function GetItemByUrl(spUrl As String) As SPListItem 
    'A site object does not care about additional parameters after site's URL 
    Dim oSite As New SPSite(spUrl) 
    'This returns the deepest SPWeb it can find 
    Dim oWeb As SPWeb = oSite.OpenWeb() 
    'here we parse out the ID parameter 
    Dim oUri As New Uri(spUrl) 
    'HttpUtility is from System.Web namespace 
    Dim oQueryParams As System.Collections.Specialized.NameValueCollection 
    oQueryParams = HttpUtility.ParseQueryString(oUri.Query) 

    Dim sParamval As String = oQueryParams.Get("ID") 
    If (sParamval.Length <= 0) Then 
     Return Nothing 
    End If 

    'This is how we get the list 
    Dim oCurrentList As SPList = oWeb.GetList(spUrl) 
    'And finally fetching the item 
    Dim oListItem As SPListItem = oCurrentList.GetItemById(Int32.Parse(sParamval)) 
    Return oListItem 
End Function 
+0

Спасибо, очень полезно! Пользуясь этим, вы можете найти список по URL-адресу. Одна вещь, которую нужно добавить в эту функцию, - это убедиться, что вы удаляете любой объект SPSite или SPWeb, который вы создаете, если это не объект Current. (Http://msdn.microsoft.com/en-us/library/aa973248.aspx) – brentlightsey

1

я обнаружил, что делает something very similar (хотя и с объектами SPAuditEntry). Решение, с которым я столкнулся, включал анализ URL-адреса для определения SPSite и SPWeb.

Поскольку SPSite принимает более длинный URL-адрес, вы также можете также открыть правый SPWeb (используя site.OpenWeb()). Я решил использовать SPSite.AllWebs.Names, чтобы выяснить, какой именно SPWeb был в нем (извлечение частей URL-адреса, а затем выполнение двоичного поиска с моей коллекцией имен SPWeb). Я предполагаю, что вам нужно будет использовать SPWeb.Lists, чтобы определить, в каком списке или библиотеке он находился.

Смежные вопросы