2009-03-31 3 views
6

나는 masterpage에 계속 mvc usercontrol에 대한 my asp.net mvc masterpage에 ViewData 전달하려고합니다. 예를 들어, mvc usercontrol로서 이름의 드롭 다운리스트를 작성해, 그것을 마스터 페이지에 두었습니다.asp.net mvc masterpages에 viewdata 전달

내가 겪고있는 문제는 ViewData를 masterpage로 전달하는 것입니다. 나는 괜찮은 솔루션을 가지고 있지만 다른 "더 나은"솔루션이 있는지 궁금 해서요 Microsoft 에서이 문서를 발견. 링크의 솔루션에 대해 싫어하는 점은 새 컨트롤러 클래스에서 상속 받도록 모든 컨트롤러를 변경해야한다는 것입니다.

http://www.asp.net/learn/MVC/tutorial-13-cs.aspx

편집 : 내가보고 있어요 문제는 내가을 ViewData에 의존 나의 masterpage의 사용자 컨트롤을 배치하는 경우, 내가 반복 에 있다는 사실이 포함이을 ViewData 모든 단일 페이지에 대한 그 마스터 페이지를 사용합니다. 위의 링크에있는 해결책이 최선의 해결책 일 수 있지만 다른 대안이 있기를 바랬습니다.

답변

1

당신이 할 수있는 일은, (많이 변경되지 않는 메뉴처럼) 다소 정적 인 데이터라면 캐시에 객체를 놓아서 모든 컨트롤러 초기화를 위해 데이터베이스가 호출되지 않도록하는 것입니다.

내가보고 있어요 문제는 내가을 ViewData에 의존 나의 masterpage의 사용자 컨트롤을 배치하는 경우, 나는 반복적으로 포함해야한다는 사실은 내가 확실히 문제를 얻지 않는다
4

마스터 페이지는 이미 ViewData에 액세스 할 수 있습니다. 당신이 강하게에 대한 액세스를 입력하려면 두 가지 작업을 수행해야합니다

  1. 당신이 일반 ViewMasterPage에서 페이지 상속을 마스터 적이 기본 클래스에서 (예를 들어 CommonViewData)를 마스터 페이지 물건을 넣어 <> 클래스 :.

    "%>
  2. 그것은 가치가 무엇인지, 나는 현재 프로젝트에이 튜토리얼 방법을 사용하고 그것은 아주 잘 작동 들어
+1

ViewData를 사용하는 내 masterpage에 사용자 정의 컨트롤을 배치하면 해당 masterpage를 사용하는 모든 단일 페이지에 ViewData를 포함해야한다는 사실입니다. – codette

0

...

해당 마스터 페이지를 사용하는 모든 단일 페이지에 대한 ViewData.

물론 그렇습니다. 물론 그렇습니다. 마스터 페이지에 사용자 정의 컨트롤이 있다면 당연히 해당 마스터 페이지를 사용하는 모든 동작 & 뷰에 대해 해당 usercontrol에 필요한 데이터를 전달해야합니다.

기본 컨트롤러를 상속 한 경우 반복하지 않아도됩니다.

일부 컨트롤러에는 특정 마스터 페이지에서 파생 된보기를 호출하거나 호출하지 않는 동작이 있습니까? 따라서 기본 컨트롤러를 구현하는 경우 특정 마스터 페이지를 사용하지 않는 작업에는 여전히 해당 뷰 데이터가 있습니다 ...? (의미가있는 경우 ;-)

+0

이 질문을하는 전적인 이유는 본래의 질문에서 링크에 제공된 솔루션에 대한 대안이 있는지 확인하는 것입니다. 그러나 나는 MS가 그들이 내놓을 수있는 "최상의"솔루션을 게시 할 것으로 생각합니다. – codette

2

기본 컨트롤러 클래스에서 OnActionExecuting 메서드를 사용하고 거기에 뷰 데이터를 채울 수 있습니까?

뭔가 같은 :

protected override void OnActionExecuting(ActionExecutingContext context) 
{ 
    context.Controller.ViewData.Model = GetDataForControl(); 
} 

그냥 생각, 그래서 나는 그것을 시도하지 않은 ...

1

난 보통 내 MasterPage에 대한 추상 컨트롤러 클래스를 사용, 그것은 최선의 해결책이 있기 때문이다 MasterPage는 "추상적 인 뷰"와 같습니다. 하지만 뷰 데이터를 포함하려면 MasgerPageController View() 메서드를 재정의합니다.

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    this.ViewData["menu"] = this.PagesRepository.GetPublishPages(); 
    return base.View(viewName, masterName, model); 
} 
+0

깨끗하고 간단합니다. 감사합니다! 4 년 후 마침내 upvote있어;) – statue

0

나는 제안 된 해결책이 효과가 있지만 이상적인 해결책은 아니라고 생각합니다. BaseController 생성자에 코드를 삽입하면 MasterPages가없는 Action 메소드 (예 : Post 메소드 및 Ajax 메소드)에 대해서도 호출됩니다.
마스터 페이지에서 Html.Action 메서드를 호출하는 것이 더 좋은 해결책이라고 생각합니다.