通过显示表单的URL查找SharePoint列表项

时间:2010-01-04 08:44:13

标签: sharepoint sharepoint-api splistitem

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

我决定创建一个小型Windows GUI应用程序,管理员可以在服务器上运行该应用程序并进行所请求的更改。但是,获取SPListItem实例的最简单方案是:

  • 管理员输入根网站的网址
  • 使用给定的网址创建SPSite ojbect:SPSite oSite=new SPSite(this.txtURL.text);
  • admin输入所需网站的相对网址
  • SPWeb对象创建为SPWeb oWeb = oSite.OpenWeb(this.txtWebUrl.text);
  • 下拉框中填充了oWeb.Lists
  • 中的所有列表标题
  • admin从列表框中选择一个列表并输入所请求项目的ID;
  • 找到所需的SPListItemoWeb.Lists[this.lstAllLists.selectedValue].GetItemById(this.txtItemId.value);

这是一条非常漫长的道路,管理员不喜欢打字,点击和等待 他们希望复制listitem显示表单的URL(从Web浏览器或某人的电子邮件中),将其粘贴到更新工具中,然后只需单击“Find it!”。

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

我知道我可以使用正则表达式来解析URL,因为它通常采用http://server/sites/[somesite]/[someweb/somesubweb]/lists/[somelist]/forms/dispform.aspx?ID=[123]的形式,但存在变体 - 例如,http://[server]/[DocumentLibrary]/Forms/RenamedDispForm.aspx?ID=[1234]具有与第一个示例完全不同的结构。 / p>

所以,问题是 - 是否有一些简单的方法可以通过它的URL找到SPListItem?从URL重建SPContext会非常棒。

编辑:刚发现可以通过传递更长的URL来构造有效的SPSite对象:

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

2 个答案:

答案 0 :(得分:5)

我自己找到了一个解决方案,我不知道的诀窍是,如果你在SPSite的构造函数中使用一个长URL,它会为你提供具有“最深”地址的SPWeb对象与您的网址匹配(此处描述:http://msdn.microsoft.com/en-us/library/ms473155.aspx

但是,我必须遍历所有列表以找出哪个列表具有所需的URL。一个简单的功能,可以满足我的需要

更新@ 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

答案 1 :(得分:1)

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

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