2011-03-17 5 views
3

MVC 3 애플리케이션을 구축 중입니다. 응용 프로그램은 하위 도메인 (예 : customer1.mysite.com -> layout1, customer2.mysite.com -> layout2 등)에 따라 다른 레이아웃을 표시 할 수 있어야합니다. 모바일 및 IE 6.MVC 3 레이아웃 및 컨트롤러

저는 레이아웃을 설정하는 로직을 수행하는 데 사용할 수있는 _ViewStart.cshtml을 보았습니다. 그러나 내가 얻지 못하는 것은 그것을위한 조절기가 어디에 있는가? 보기에 모든 코드를 써야합니까?

레이아웃과 관련하여 다른 질문으로 일반적인 행동에 대한 코드를 제외시키는 방법은 무엇입니까? 당신은 그것을위한 조절기가 있습니까?

그리고 마지막으로 asp.net MVC2에서 영역의 개념을 보았습니다. 이제는 면도기를 갖게 된 것이지요?

당신이 _ViewStart에서이 작업을 수행 할 수하는 동안 포함 내가 더 좋은 방법은 사용자 에이전트 또는 도메인을 기반으로 custom view engine에서 작성 될 것이라고 생각하는 당신의 도움을

프레드

+0

BTW - 시스템을 멀티 테넌트 시스템/아키텍처라고합니다. 이 주제에 대한 몇 가지 정말 좋은 mvc 관련 질문이 있습니다. 예 : http://stackoverflow.com/search?q=asp.net-mvc+ multipultant. – Ahmad

+0

감사합니다! –

답변

1

을 주셔서 감사합니다 다른 레이아웃. 그런 다음 공통 컨트롤러와 뷰를 가지게되며 레이아웃 만 다를 것입니다.

+0

대린, 매우 흥미로운 대안을 고맙다. 샘플을 전혀 보지 않고 보았습니다. 누군가 이미 시도했는지 아십니까? http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx : : "중요 : _ViewStart.cshtml을 사용하면 코드를 작성할 수 있으므로 선택적으로 기본 속성 집합보다 레이아웃 선택 논리를 더 풍부하게 만들 수 있습니다. 예를 들어 사이트에 액세스하는 장치의 유형에 따라 사용하는 레이아웃 템플릿을 다양하게 할 수 있으며 해당 장치에 대해 전화 또는 태블릿 최적화 레이아웃을 가질 수 있습니다. PC/노트북을위한 데스크톱 최적화 된 레이아웃을 제공합니다. " –

2

ViewBag을 사용하는 것이 좋습니다.

OnActionExecuting 동안 하위 도메인을 찾아서 ViewBag로 밀어 넣는 것이 좋습니다. 다른 컨트롤러가 상속 한 사용자 정의 BaseController 나 ActionFilter에서이 작업을 수행 할 수 있습니다.

그런 다음 _ViewStart에서 ViewBag에 switch 문을 작성하여 레이아웃을 제어 할 수 있습니다.

예를 들어 _viewStart.cshtml을 포함하여 모든 면도기 뷰에서 @ViewBag.Subdomain을 채우는 ActionFilter가 있습니다.

public class AddSubdomainToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var subdomain = filterContext.HttpContext.Request.Url.Authority.Split('.').First(); 
     var controller = filterContext.Controller as Controller; 
     controller.ViewData.Add("Subdomain", subdomain); 
    } 
} 

그런 다음이 새로운 [AddSubdomainToViewData] 속성으로 컨트롤러를 꾸미십시오.

마지막으로, _ViewStart.cshtml에, 같은 것을 할 :

@{ 
    Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml"; 
} 

이 각 하위 도메인에 대해 다른 면도기 레이아웃을 사용합니다.

+0

고마워요 포트먼, 액션 필터를 사용하거나 다음과 같이 직접 지정하는 것이 좋습니다 : –

+0

죄송합니다. 입력을 누릅니다 ... @ { var subdomain = this.Context.Request.Url.Authority.Split ('.'). First(); Layout = "~/Views/Shared /"+ (@ ViewContext.ViewData [ "Subdomain"]을 String으로 사용) ?? String.Empty) + "_layout.cshtml"; } ' –

+0

* 하위 도메인을 사용중인 경우 * ActionFilter를 무시하고 ViewStart에서 HttpContext를 직접 사용하십시오. 하지만 당신이 ActionFilter에 캡슐화해야하는 경우에는 데이터베이스 조회를 수행하기 위해 하위 도메인을 사용하려고 할 것입니다. – Portman

관련 문제