2014-10-02 2 views
0

사용자가 페이지 왼쪽의 패널에있는 MVC 웹 앱에 검도 트리를 표시하도록 요청했습니다. 그들은 왼쪽 패널이 모든 화면에 나타나기를 원합니다. 나는 나무의 내용을 얻을 뷰에 모델을 결합하는 데이터베이스 호출을 해당 작업의 내부_Layout 페이지에서 TreeView 데이터를 한 번만로드하는 방법

<div> 
    @{Html.RenderAction("GetTree", "Tree");} 
</div> 

: 현재

나는 검도 트리를 렌더링 내 _Layout.cshtml 페이지의 섹션을

분명히이 패턴을 사용하면 _Layout에있는 모든 페이지가 호출되고 트리 데이터가 데이터베이스에서 다시 페치됩니다. 이것은 매우 효율적이지 않습니다.

단일 데이터베이스 호출 만 가능하도록 더 좋은 방법은 무엇입니까?

+0

모든 페이지 및 모든 사용자에 대해 트리의 내용이 동일합니까? –

+0

if (TreeViewItemModel == null)을 어딘가에 넣습니다.로드 된 곳에서 어떤 유형의 캐시를 통합합니다. –

답변

1

트리의 내용이 모든 페이지와 모든 사용자에게 동일하다고 가정합니다.

그런 경우 검색된 데이터베이스 데이터를 캐시하여 모든 페이지 렌더링에서 검색하지 않아도됩니다. 캐시하는 데는 여러 가지 방법이 있습니다. 가장 간단한 방법은 ASP.NET 자체의 캐싱을 사용하는 것입니다 (자세한 내용은 연습을 통해 here 참조).

부분 페이지 캐싱에 들어가기를 원하지 않는 한 모든 페이지에서 렌더링해야하지만, MVC에서 어떻게 작동하는지 모르겠다.하지만 반복되는 데이터베이스 히트는 확실히 피할 수있다.

ETA : 회사별로 필요한 트리 데이터를 검색하는 래퍼 또는 도우미 클래스를 만들 수 있습니다. 관련 방법은 다음과 같이 보일 것입니다 :

public IEnumerable<TreeViewItemModel> GetCachedTreeDataByCompany(int companyId) 
{ 
    var data = Cache["TreeData"] as IEnumerable<TreeViewItemModel>; 
    if(data == null) 
    { 
     data = GetTreeData(); // whatever you need to do to get the data 
     Cache.Insert("TreeData", data); 
    } 
    return data.Where(tvim => tvim.CompanyId == companyId).ToArray(); 
} 
+0

콘텐츠는 사용자가 속한 회사에 따라 다르지만 세션에 CompanyId를 저장하고 있습니다. 이를 사용하여 트리 데이터를 얻기위한 데이터베이스 호출을 만든다. – cktech

+0

캐시가 옵션이라는 것도 알고 있으며 사람들이이 시나리오에 더 적합한 다른 아이디어 나 패턴을 갖고 있는지 알고 싶습니다. 예를 들어 디자인의이 부분에 _Layout을 사용하지 않았을 수도 있습니다. – cktech

+0

그래서 캐시는 옵션이 있지만 그것은 회사 당 분리해야한다 – cktech

관련 문제