有时用户需要更改SharePoint列表项中不可编辑的信息,例如,以编辑形式隐藏的字段(在我的情况下,它是记录编号)。
我决定创建一个小型Windows GUI应用程序,管理员可以在服务器上运行该应用程序并进行所请求的更改。但是,获取SPListItem
实例的最简单方案是:
SPSite
ojbect:SPSite oSite=new SPSite(this.txtURL.text);
SPWeb
对象创建为SPWeb oWeb = oSite.OpenWeb(this.txtWebUrl.text);
oWeb.Lists
SPListItem
为oWeb.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")
答案 0 :(得分:5)
我自己找到了一个解决方案,我不知道的诀窍是,如果你在SPSite
的构造函数中使用一个长URL,它会为你提供具有“最深”地址的SPWeb
对象与您的网址匹配(此处描述:http://msdn.microsoft.com/en-us/library/ms473155.aspx)
但是,我必须遍历所有列表以找出哪个列表具有所需的URL。一个简单的功能,可以满足我的需要:
更新@ 2012-08-01:
GetList
方法
在SPWeb
对象中。 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来确定它所在的列表或库。