문제
안녕하세요. 목록 항목을 가져오려고 하는데 이것이 좋은 방법인지 알고 싶습니다.
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...
50개의 하위 사이트와 그 안에 더 많은 하위 사이트가 포함된 사이트 모음이 1개 있습니다.내 질문은 다음과 같습니다.
하위 사이트 번호 10 아래의 하위 사이트 중 하나에 있고 이 코드가 실행된다고 가정하면 여전히 루트 웹 목록을 선택하거나 오류가 발생합니까?
SPContext.Current.Web.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 객체를 닫습니다. 그들을 전에는 아니지만 이전에는 아니지만
코드를 사용하는 또 다른 방법은 다음과 같습니다.
.SPWeb spWeb = SPContext.Current.Site.RootWeb; SPList spList = spWeb.Lists.TryGetList("MyList");
보시다시피 코드 / 시스템 리소스가 적합하고 적은 코드 / 시스템 리소스를 처리 할 수없는 현재 사이트 RootWeb 객체를 사용하여 폐기 할 필요가 없습니다!
다른 팁
@robert가 지적한 것처럼 루트 웹을 픽업합니다.그러나 SPWeb
속성에서 검색된 SPSite.RootWeb
객체를 Dispose 할 필요가 없습니다.Spcontext SPSite
에서 SPSite spsite = SPContext.Current.Site;
객체를 직접 가져올 수도 있고 따라서 명시 적으로 배치되어야하는 새 파일을 인스턴스화하는 대신 폐기 할 필요가 없습니다.
루트 웹을 픽업합니다.
그러나 "명령문 사용"을 사용하지 않는 경우 SPSITE를 처분하는 것을 잊지 마십시오.
spsite.Dispose()
. 당신이 사용할 수있는 SPContext.Current.Site.Url
, 코드 내부에 SPSite 객체를 생성하는 동안 다음을 사용하십시오. site.OpenWeb()
, 이는 루트 웹을 제공합니다(SPSite 개체는 사이트 URL로 생성되므로).항상 사용하는 것이 더 좋습니다 using
물건을 처분하는 것.
using (SPSite site=new SPSite(SPContext.Current.Site.Url))
{
using(SPWeb web=site.OpenWeb())//always gets you the root web
{
}
}
이 블로그를 참조하세요 SPDisposeCheck 모범 사례.