2012-03-21 2 views
0

저는 MVC를 처음 사용하고 새 프로젝트에 사용하기로했습니다. 필자는 회사의 인트라넷 홈페이지를 재 설계하는 임무를 맡았습니다. 사실상 열에는 링크와 하위 링크가 많이 있습니다.asp.net MVC 데이터 모델 도움말

예 :

  • 헤드
    • 링크 1 링크 2
  • 링크 (3)
  • 링크 4
    • 링크 5

캐치은 이러한 링크는/관리자 페이지에서 (추가, 편집, 순서, 삭제) 관리 할 데이터베이스에서 제공 할 것입니다. 홈페이지이기 때문에 가능한 한 적은 수의 DB 호출을 만들고 싶지만 이렇게 할 필요는 없습니다.

db 테이블을 만들었고 MVC에서보기 페이지에서 코드를 많이 사용하지 않고 페이지를 반복하고 렌더링하기가 어려웠습니다 (나는 그것을 얻었습니다). 이것이 목적이 아니라고 생각했습니다./MVC의 모범 사례와 나는 내 모델에 뭔가 잘못되어 있어야합니다. 여기

예를 기록 내 테이블 구조입니다 :

ID| Text  | Href  | OrderId | NewWindow | ParentId 
1 | Head  | NULL  | 1 | 0  | NULL 
2 | Link 1 | link1.htm | 1 | 1  | 1 
3 | Link 2 | link2.htm | 2 | 1  | 1 
4 | Link 3 | link3.htm | 2 | 1  | NULL 
5 | Link 4 | link4.htm | 3 | 1  | NULL 
6 | Link 5 | link5.htm | 1 | 1  | 5 

가 꽤 많이 나는 전체 테이블을 반환이 정말 지저분 foreach 루프를하고 있었고, 난 "머리 (부모) 링크"를 결정하고 처리했다 그에 따라 HTML. 그것은 정말로 고전적인 ASP 시대를 상기 시켰습니다.

나는 모델과 관련이 있고 더 작은 데이터 세트로 작업하기를 바라고있다.

내가 어떻게 처리해야하는지에 대한 조언이나 제안 사항이 있으십니까?

답변

0

당신이 말한 것처럼, 복잡한 논리를 피하는 것이 좋습니다. 가능한 한 많은 데이터를보기 위해 간단한 데이터를 전달해야합니다. 항상 ifforeach 문을 사용하지만 피하려고하는 것보다 더 복잡 할 수 있습니다.

컨트롤러의 작업 방법에서 개체의 데이터 액세스 및 어셈블리를 수행하는 것이 더 좋으며, 일반적으로 이러한 작업조차도 다른 서비스 (예 : 호출)로 전달 될 수 있습니다. 저장소, 매퍼 (mapper) 호출). 일반적으로 도메인에서 바로 객체가 아닌 ViewModel 객체를보기로 전달하는 것이 좋습니다.(이 경우에도 객체는 항상 표시 목적으로 사용되지만 너무 걱정하지 않아도됩니다.)

이러한 링크가 특정 경우 HomeController의 액션 메소드에이 모든 것을 넣을 수 있습니다 홈 페이지로 이동하거나 사이트 전체 메뉴 인 경우 구체적으로 처리 할 별도의 NavController를 가질 수 있습니다.

public class NavController : Controller 
{ 
    // ... 

    [ChildActionOnly] 
    public PartialViewResult SiteMenu(string currentPage) 
    { 
     // Get your flat list of menu items from the DB 
     var menuItems = _siteMapRepo.GetMenuItems(); 

     // Map them into something more tree-like... 
     var treeMenu = MapFlatItemsToTreeMenu(menuItems); 

     return View("_Menu", treeMenu); 
    } 

    // ... 
} 

다음을 렌더링하는 부분보기가 있습니다. _Menu.cshtml. 당신이있는 한,

@{Html.RenderAction("SiteMap", "Nav");} 

가 _Menu.cshtml의 코드 흥미로운 얻을 수 있습니다 :

는 그런 곳 부모 뷰에서, 가장 가능성이 귀하의 사이트 레이아웃, 당신의 메뉴를 당길 수있는 RenderAction 전화를 할 수 나무 구조를 다루고 있습니다. RenderAction의 결과가 새로운 요청으로 이어 지므로이 시점에서 RenderAction 대신 RenderPartial을 사용하여 부분 노드 뷰에서 재귀 호출을 할 수 있습니다. 뭔가 같은 ...

@model MenuItem 

@if (Model.HasChildren) 
{ 
    <ul> 
    @foreach (var child in Model.Children) 
    { 
     @{Html.RenderPartial("_Menu", child);} 
    } 
    </ul> 
} 
else 
{ 
    <li> 
     // do something with Model.Url etc. 
    </li> 
} 

면책 조항 : 사실 난 그냥 써,이 시도하지 않은,하지만 내가 희망 요점을 제공해야합니다.

이미 다른 사람이 이미 사용할 수있는 비슷한 항목을 굴려 놓았는지 확인할 수도 있습니다 (예 : MvcSiteMapProvider 또는 MvcTreeView).

+0

트리의 인접성 목록 표현을 객체 계층에 매핑하는 방법에 대한 정보는이 질문을 참조하십시오. http://stackoverflow.com/questions/8361911/asp-net-databound-menu-multilevel/8364548#8364548 – ngm

0

나는 내 프로젝트에서 같은 일을했습니다. 이 데이터가 사이트 맵 전용 인 경우 DB 행이 너무 가볍습니다.

사이트 맵을 저장하기 위해 xml 파일 (또한 단일 필드로 db에 저장 될 수 있음)을 사용했으며 지금까지 제대로 작동합니다.

좋은 점은 계층 적 위젯 (트리 또는 ul)에 쉽게 바인딩 될 수 있다는 것입니다. 거의 수정되지 않기 때문에 캐시하기가 쉽습니다. 링크 및 텍스트 정보를 XML 속성에 저장할 수 있습니다.

+0

그리고 ASP.NET MVC를이 용도로 사용하셨습니까? – Antoni