絶対URLからSPListItemを取得する方法です。
SPListItemの取得方法は、対象がファイルまたはフォルダか、リストアイテムかで若干異なります。
ファイル、フォルダの取得
ファイルまたはフォルダのSPListItemを取得する場合、SPListと同様、ホスト名からの相対URLで取得します。
以下のコードでは、Documentsドキュメントライブラリの直下のtestフォルダ内のmemo.txtのSPListItemを取得します。
1 | <span class="lnum"> 1: </span>Uri uri = <span class="kwrd">new</span> Uri(<span class="str">"http://test.co.jp/Documents/test/memo.txt"</span>); |
1 | <span class="lnum"> 2: </span>SPSite site = <span class="kwrd">new</span> SPSite(uri.AbsoluteUri); |
1 | <span class="lnum"> 3: </span>SPWeb web = site.OpenWeb(); |
1 | <span class="lnum"> 4: </span><span class="kwrd">string</span> targetUrl = uri.AbsoluteUrl.Replace(<span class="kwrd">string</span>.Format(<span class="str">"{0}{1}"</span>, uri.GetLeftPart(UriPartial.Scheme), uri.Host), <span class="str">""</span>); |
1 | <span class="lnum"> 5: </span>SPListItem file = web.GetListItem(targetUrl); |
次は、Documentsドキュメントライブラリの直下のtestフォルダのSPListItemを取得するコードです。
1 | <span class="lnum"> 1: </span>Uri uri = <span class="kwrd">new</span> Uri(<span class="str">"http://test.co.jp/Documents/test"</span>); |
1 | <span class="lnum"> 2: </span>SPSite site = <span class="kwrd">new</span> SPSite(uri.AbsoluteUri); |
1 | <span class="lnum"> 3: </span>SPWeb web = site.OpenWeb(); |
1 | <span class="lnum"> 4: </span><span class="kwrd">string</span> targetUrl = uri.AbsoluteUrl.Replace(<span class="kwrd">string</span>.Format(<span class="str">"{0}{1}"</span>, uri.GetLeftPart(UriPartial.Scheme), uri.Host), <span class="str">""</span>); |
1 | <span class="lnum"> 5: </span>SPListItem folder = web.GetListItem(targetUrl); |
このように、ファイルとフォルダはSPWeb.GetListItemメソッドで取得できます。
なお、SPWeb.GetListItemメソッドに、存在しないファイル、フォルダのURLを渡したり、ビューやドキュメントライブラリなどに所属しないページ(チームサイトのdefault.aspxなど)のURLを渡すと、SPListItemは取得できず、nullが返ります。
リストアイテムの取得
リストアイテムのSPListItemを取得するには、まずSPListを取得する必要があります。
その後、URLのクエリ文字列にある「ID」からItemIDを取得して、SPList.GetItemByIdメソッドを呼び出します。
1 | <span class="lnum"> 1: </span>Uri uri = <span class="kwrd">new</span> Uri(<span class="str">"http://test.co.jp/test/Lists/List1/DispForm.aspx?ID=1"</span>); |
1 | <span class="lnum"> 2: </span><span class="rem">// リストを取得</span> |
1 | <span class="lnum"> 3: </span>SPSite site = <span class="kwrd">new</span> SPSite(uri.AbsoluteUri); |
1 | <span class="lnum"> 4: </span>SPWeb web = site.OpenWeb(); |
1 | <span class="lnum"> 5: </span><span class="kwrd">string</span> targetUrl = uri.AbsoluteUrl.Replace(<span class="kwrd">string</span>.Format(<span class="str">"{0}{1}"</span>, uri.GetLeftPart(UriPartial.Scheme), uri.Host), <span class="str">""</span>); |
1 | <span class="lnum"> 6: </span>SPList list = web.GetList(targetUrl); |
1 | <span class="lnum"> 7: </span><span class="rem">// リストアイテムを取得</span> |
1 | <span class="lnum"> 8: </span>Regex reg = <span class="kwrd">new</span> Regex(@’[?|&]ID=d”, RegexOptions.IgnoreCase); |
1 | <span class="lnum"> 9: </span><span class="kwrd">int</span> itemId = <span class="kwrd">int</span>.Parse(reg.Match(url.Query).Value.Split(‘=’)[1]); |
1 | <span class="lnum"> 10: </span>SPListItem listItem = list.GetItemById(itemId); |
SPList.GetItemByIdメソッドに、存在しないアイテムのIDを渡すと、ArgumentExceptionが発生します。
最後に番外編として、リストアイテムをSPWeb.GetListItemメソッドで取得する方法を紹介します。
SPWeb.GetListItemメソッドはURLからファイル、フォルダのSPListItemを取得することができますが、リストアイテムのSPListItemを取得することはできません。
ただし、URLを以下のようにすると取得することができます。
例えば、「http://test.co.jp/test/Lists/List1/DispForm.aspx?ID=1」というURLを以下のように変更すると、SPWeb.GetListItemメソッドで取得できるようになります。
「http://test.co.jp/test/Lists/List1/1_.000」
絶対URLから上記形式への変換が手間でなければ、このやり方で取得してもよいでしょう。