質問
こんにちはって取得したリスト項目を知りたい場合は、これは良い。
SPSite spsite = new SPSite(SPContext.Current.Web.Url);
SPWeb spWeb = spsite.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");
//here is the code to fetch the values...
私たちは1つのサイトコレクションを持っていて、50のサブサイトとその中にもっと多くのサブサイトがあります。私の質問は;
私がサブサイト番号10の下のサブサイトの1つにいて、このコードが実行されたとしますが、それでもルートwebリストを取得するか、エラーが発生しますか?
私はspcontextの値のために混乱しています。流れ。ウェブ...Urlは、それぞれの場所の現在のURLになります。その後、コードはまだ動作しますか?
解決
廃棄されていない新しいサイトの作成SPContext.current.web.urlは文字列URLのみを生成します。
正しい方法:
using (SPSite spsite = new SPSite(SPContext.Current.Web.Url))
{
SPWeb spWeb = spsite.RootWeb;
SPList spList = spWeb.Lists.TryGetList("MyList");
}
.
あなたが見つめたようにspwebを処分する必要はありません。その新しいSPSite Webオブジェクトを使用しています。処分すると、ULSのエラーが発生する可能性がある場合:
以前に閉じたSPWebオブジェクトに対するSPREQUESTの使用を検出しました。お願いします から取得したすべてのオブジェクトを使用して完了したらSPWebオブジェクトを閉じます。 それらは、以前はそうではありません。
コードを使用するもう1つの方法は次のとおりです。
.SPWeb spWeb = SPContext.Current.Site.RootWeb; SPList spList = spWeb.Lists.TryGetList("MyList");
現場のRootWebオブジェクトを使用して、コード/システムリソースが少ない現在のサイトのRootWebオブジェクトを使用して配置する必要はありません。
他のヒント
@Robertが指摘したように、ルートウェブをピックアップします。しかし、あなたは処分する必要はありません SPWeb
から取得されたオブジェクト SPSite.RootWeb
プロパティ。また直接得ることができます SPSite
SPContextからのオブジェクト SPSite spsite = SPContext.Current.Site;
したがって、明示的に破棄する必要がある新しいものをインスタンス化する代わりに、破棄する必要はありません。
rootwebをピックアップします。
しかし、 "using-statement"を使用しない場合は、SPSiteを廃棄してください。
spsite.Dispose()
. コード内のSPSiteオブジェクトを作成しながら、SPContext.Current.Site.Url
を使用してから、site.OpenWeb()
を使用してルートWebを使用します(SPSiteオブジェクトがサイトURLで作成されているため)。
オブジェクトを配置するには、常にusing
を使用する方が良いです。
using (SPSite site=new SPSite(SPContext.Current.Site.Url))
{
using(SPWeb web=site.OpenWeb())//always gets you the root web
{
}
}
.
このブログについて spdisposecheckのベストプラクティス。