0

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

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

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

这是一条很长的路,管理员不喜欢打字、点击和等待。
他们想复制列表项显示表单的 URL(从 Web 浏览器或某人的电子邮件中),将其粘贴到更新工具中,然后单击“查找它!”。

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

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

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

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

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

2 回答 2

5

自己找到了一个解决方案,我不知道的技巧是,如果您在 的构造函数中使用长 URL SPSite,它会为您SPWeb提供与您的 url 匹配的“最深的”地址的对象(在此处描述: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
于 2010-01-05T14:41:34.100 回答
1

我发现自己在做一些非常相似的事情(尽管使用了 SPAudiEntry 对象)。我想出的解决方案涉及解析 URL 以找出 SPSite 和 SPWeb。

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

于 2010-01-04T15:24:36.227 回答