代码之家  ›  专栏  ›  技术社区  ›  naivists

按显示表单的URL查找SharePoint列表项

  •  0
  • naivists  · 技术社区  · 15 年前

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

    我决定创建一个小的WindowsGUI应用程序,管理员将在服务器上运行该应用程序并进行请求的更改。但是,获取 SPListItem 我发现:

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

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

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

    我知道我可以用regex解析URL,因为它通常是 http://server/sites/[somesite]/[someweb/somesubweb]/lists/[somelist]/forms/dispform.aspx?ID=[123] 但是也有变化-例如, http://[server]/[DocumentLibrary]/Forms/RenamedDispForm.aspx?ID=[1234] 与第一个示例的结构完全不同。

    所以,问题是-有什么简单的方法可以找到 劈裂 通过它的URL?重建 SPContext 从网址上看会很好。

    编辑:刚发现可以构造一个有效的 斯派斯特 对象,通过将其传递更长的URL:

    Dim oSite as New SPSite("http://server/sites/site/Lists/test/DispForm.aspx?ID=136")
    
    2 回复  |  直到 11 年前
        1
  •  5
  •   Zarepheth    11 年前

    我自己找到了一个解决方案,但我不知道的诀窍是,如果在 SPSite 它给了你 SPWeb 对象的“可能最深”地址与您的URL匹配(此处描述: http://msdn.microsoft.com/en-us/library/ms473155.aspx )

    尽管如此,我还是必须遍历所有列表,以找出哪个列表具有所需的URL。一个简单的函数,可以满足我的需要 :

    2012-08-01更新:

    • 不需要遍历列表集合,有一个 GetList 方法 在里面 SPWEB 对象。
    • 不用在URL上执行regex,可以使用 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
    
        2
  •  1
  •   Community Justin Hirsch    7 年前

    我发现自己在做 something very similar (尽管有空间物体)。我提出的解决方案涉及解析URL以找出spsite和spweb。

    由于spsite需要更长的URL,您也可以打开正确的spweb(使用site.openweb())。我决定使用spsite.allwebs.name来精确地找出该项目所在的spweb(提取部分URL,然后对spweb名称集合进行二进制搜索)。我猜你必须使用spweb.lists来确定它在哪个列表或库中。

    推荐文章