私はSharePoint 2010に取り組んでいます。そのライブラリにドキュメントライブラリIDとドキュメントIDを持っています。ドキュメントライブラリが存在するWebサイトがないので、ドキュメントの完全なURLを取得する必要があります。実行時。どうすれば入手できますか。以下を試しました。
string filepath = currentList.DefaultViewUrl + "/" + sListItem.Url;
これに答えてください。
SPListItem
の「EncodedAbsUrl」フィールドを使用します。 SPFile
でも機能します。
SPListItem item = ...;
string absUrl = (string) item[SPBuiltInFieldId.EncodedAbsUrl];
またはSPFile
SPFile file = ...;
string absUrl = (string) file.Item[SPBuiltInFieldId.EncodedAbsUrl];
組み込みのフィールドIDは確かに最適な方法ですが、エンコードされたURLを返します。
最良の方法は、どこかでユーティリティクラスに小さな拡張メソッドを追加することだと思います。
public static string AbsoluteUrl(this SPFile File, bool Decode = true)
{
string EncodedUrl = File.Item[SPBuiltInFieldId.EncodedAbsUrl].ToString();
if (Decode)
return SPEncode.UrlDecodeAsUrl(EncodedUrl);
else
return EncodedUrl;
}
そして、次のように呼び出します
Item.File.AbsoluteUrl();
デコードされたURLが必要な場合、または
Item.File.AbsoluteUrl(false);
uRLをエンコードしたままにする場合。
Decodeのデフォルトのパラメーター値は.Net4 +でのみ使用できるため、SP2013でのみ使用できますが、SP2010のオーバーロードメソッドを簡単に作成できます。 SPEncodeクラスにアクセスするには、Microsoft.SharePoint.Utilities名前空間への参照も必要です。
これを試して 、
using (SPSite ospSite = new SPSite("http://abcd:24931"))
{
using (SPWeb web = ospSite.OpenWeb("/subsite")
{
// Get document library collection here and fetch all the document urls
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["docu"];
//where docu is my document library
SPListItemCollection items = docLib.Items;
foreach (SPListItem item in items)
{
string url = item.Url;
}
}
}
これでうまくいくといいのですが。
これがドキュメントライブラリの場合は、これを試してください。
item.Web.Url+"/"+item.File.Url
public string GetItemURL(SPListItem item)
{
string web = item.Web.Url;
string listID = item.ParentList.ID.ToString();
string contentType = item.ContentTypeId.ToString();
string itemID = item.ID.ToString();
string url = web+"/_layouts/listform.aspx?PageType=4&ListID={"+listID+"}&ID="+itemID+"&ContentTypeID="+contentType;
return url;
}
それは私のために働いています。私が助けてくれることを願っています(リストアイテムのURL)
以下のコードを使用して、ファイルの絶対URLを取得します。
SPFile file;
string url = file.Item[SPBuiltInFieldId.EncodedAbsUrl] as string;
価値があるのは、item.Web
プロパティは、実際にSPWeb
オブジェクトをインスタンス化していることを意味します。つまり、これを破棄する必要があります。そうしないと、メモリリークが発生します。
すでに述べたより優れた、より速い方法がある場合、それは多くのオーバーヘッドです。
BuiltInFieldId.EncodedAbsUrl
これはあなたが望むものへの最も簡単なアクセスを提供するので、言及されたアプローチ。