2010-01-04 4 views
0

사용자가 편집 할 수없는 SharePoint 목록 항목의 정보를 변경해야하는 경우가 있습니다 (예 : 편집 번호가없는 경우) (예 : 기록 번호) .표시 양식의 URL을 사용하여 SharePoint 목록 항목 찾기

관리자가 서버에서 실행하고 요청한 변경을 수행하는 작은 Windows GUI 응용 프로그램을 만들기로 결정했습니다. 그러나, 간단한 시나리오는 내가 발견 SPListItem의 인스턴스를 얻을 수 있었다 :

  • 관리자가 지정한 URL을 사용하여, SPSite ojbect가 만들어 루트 사이트
  • 의 URL을 입력 : SPSite oSite=new SPSite(this.txtURL.text);
  • 관리 드롭 다운 상자 oWeb.Lists
  • 에서 모든리스트 타이틀로 채워진다
  • SPWeb oWeb = oSite.OpenWeb(this.txtWebUrl.text); 같은 SPWeb 객체 생성
  • reqired 웹의 상대적 URL을 입력
  • 관리자가 목록 상자에서 목록을 선택하고 요청한 항목의 ID를 입력합니다.
  • 필요한 SPListItem이 매우 긴 경로와 관리자가 클릭을 기다리고, 타이핑을 할 수없는 등의 작업을 수행하지 oWeb.Lists[this.lstAllLists.selectedValue].GetItemById(this.txtItemId.value);

로 발견된다.
(웹 브라우저 또는 다른 사람의 이메일에서) listitem의 표시 양식 URL을 복사하여 업데이트 도구에 붙여 넣은 다음 "찾기"를 클릭하십시오.

이 작업을 수행하는 방법에 대한 힌트가 필요합니다.

대개 의 형식이기 때문에 정규 표현식을 사용하여 URL을 구문 분석 할 수 있지만 변형이 존재합니다. 예를 들어 http://[server]/[DocumentLibrary]/Forms/RenamedDispForm.aspx?ID=[1234]은 첫 번째 예와 완전히 다른 구조를가집니다.

그래서 질문은 - URL로 SPListItem을 쉽게 찾을 수있는 방법이 있습니까? URL에서 SPContext을 복원하는 것이 좋습니다.

편집 : 그냥 그것에게 훨씬 긴 URL을 전달하여 올바른 SPSite 객체를 생성하는 것이 가능하다는 것을 발견 :

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

답변

5

해결책을 찾았습니다. 내가 모르는 속임수는 생성자에서 긴 URL을 사용하는 경우입니다. SPSite, 그것은 당신에게 당신의 URL을 일치 "깊은 가능"주소로 SPWeb 객체를 제공합니다 (여기에 설명 : http://msdn.microsoft.com/en-us/library/ms473155.aspx)

을 아직도, 나는 필요한 URL이있는 목록을 찾아 모든 목록을 통해 루프가 .내가 을 필요하지 간단한 기능 :

UPDATE 2012-08-01 @ 목록 컬렉션을 루프

  • 필요, SPWeb 객체의 GetList 방법 있다.
  • 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을 사용하여 URL로 목록을 찾습니다. 이 함수에 추가 할 것은 현재 개체가 아니라면 인스턴스화하는 SPSite 또는 SPWeb 개체를 모두 처리해야합니다. (http://msdn.microsoft.com/en-us/library/aa973248.aspx) – brentlightsey

1

내가 나 자신 something very similar (SPAuditEntry 물체에 있지만) 일을 발견했다. SPSite와 SPWeb을 파악하기 위해 URL 구문 분석과 관련된 해결책을 찾았습니다.

SPSite가 더 긴 URL을 사용하기 때문에 site.OpenWeb()을 사용하여 올바른 SPWeb을 열 수도 있습니다. SPSite.AllWebs.Names를 사용하여 항목의 SPWeb을 정확히 파악했습니다 (URL의 일부를 추출한 다음 SPWeb 이름 컬렉션에 대해 이진 검색을 수행함). 그렇다면 SPWeb.Lists를 사용하여 목록이나 라이브러리를 확인해야합니다.

관련 문제