2010-01-04 43 views
0

有时,用户需要更改SharePoint列表项中不可编辑的信息,例如,编辑表单中隐藏的字段(在我的情况下,它是记录编号) 。按显示表单的URL查找SharePoint列表项

我决定创建一个小的Windows GUI应用程序,管理员可以在服务器上运行并进行所需的更改。然而,最简单的方案获得SPListItem的实例,我发现:

  • 管理员进入根网站
  • 创建一个SPSite ojbect的URL,利用给定的URL:SPSite oSite=new SPSite(this.txtURL.text);
  • 管理进入reqired网络
  • SPWeb oWeb = oSite.OpenWeb(this.txtWebUrl.text);
  • 下拉框中填写所有列表标题从oWeb.Lists
  • SPWeb对象被创建的相对URL
  • 管理员从列表框中选择一个列表并输入请求项目的ID;
  • 所需SPListItem发现为oWeb.Lists[this.lstAllLists.selectedValue].GetItemById(this.txtItemId.value);

这是一个很长的路径和管理员没有做喜欢做的打字,点击和等待。
他们想复制listitem的显示表单的URL(从网页浏览器或别人的电子邮件),将其粘贴到更新工具,然后只需点击“查找它!”。

我需要提示如何做到这一点。

我知道我大概可以解析URL与正则表达式,因为它是典型的http://server/sites/[somesite]/[someweb/somesubweb]/lists/[somelist]/forms/dispform.aspx?ID=[123]形式,但存在偏差 - 例如,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)仍然

,我不得不遍历所有的列表,以找出哪个列表具有所需的网址。一个简单的函数,它什么,我需要

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 2010-03-22 19:13:45

1

,我发现自己做something very similar(虽然SPAuditEntry对象)。我提出的解决方案涉及解析URL以找出SPSite和SPWeb。

由于SPSite需要更长的URL,因此您也可以打开正确的SPWeb(使用site.OpenWeb())。我决定使用SPSite.AllWebs.Names来确定项目所在的SPWeb(提取部分URL,然后对我的SPWeb名称进行二进制搜索)。我猜你会不得不使用SPWeb.Lists来确定它在哪个列表或库。

相关问题