2011-09-08 2 views
3

저는 두 비즈니스 그룹을위한 일반적인 웹 애플리케이션을 만들고 있습니다. 로고/배너는 쿼리 문자열을 기반으로 변경해야합니다. 예를 들어, URL이 http://foo.com/test?bg=a 인 경우 비즈니스 그룹 A의 로고가 표시되고 URL이 http://foo.com/test?bg=b 인 경우 비즈니스 그룹 b의 로고가 표시됩니다. 단 하나의 행동 만했다면 이것은 문제가되지 않습니다. 그러나 나는 많은 행동을한다.Asp.net MVC 3 글로벌 querystring?

모든 작업에 대해 쿼리 문자열을 확인할 수는 있지만 좋은 방법이 있어야합니다. 나는 라우팅 물건으로 뭔가를 할 필요가 있지만 어떻게 해야할지 모른다고 생각한다. 아무도 내가 그것을하는 방법을 알려주실 수 있습니까?

답변

1

쿼리 문자열 매개 변수를 기반으로 특정 클래스 이름을 일부 div에 추가하는 사용자 지정 도우미 메서드를 작성할 수 있습니다. 그럼 물론 배경 이미지를 적용하는 CSS 파일에 다른 클래스 정의가 있어야합니다.

<div class="@Html.BannerClass()">OK</div> 

항상 적용됩니다이 방법 : 당신의 _Layout 당신이 사업부 또는 몸처럼 어떤 자리에이 클래스를 적용 할 수에서 다음

public static class HtmlExtensions 
{ 
    public static string BannerClass(this HtmlHelper html) 
    { 
     var bg = html.ViewContext.Controller.ValueProvider.GetValue("bg"); 
     if (bg == null || string.IsNullOrEmpty(bg.AttemptedValue)) 
     { 
      // no bg parameter => return a default class 
      return "default_banner"; 
     } 

     if (string.Equals("a", bg.AttemptedValue)) 
     { 
      return "banner_a"; 
     } 
     else if (string.Equals("b", bg.AttemptedValue)) 
     { 
      return "banner_b"; 
     } 

     // unknown value for the bg parameter => return a default class 
     return "default_banner"; 
    } 
} 

를 실행 한 다음, 예를 들어

애플리케이션의 모든 뷰.

지금 남아있는 그 모두가 다른 배너 대한 CSS 규칙을 정의하는 것입니다

.default_banner { 
    background-image: url('../images/default_banner.png') 
} 

.banner_a { 
    background-image: url('../images/banner_a.png') 
} 

.banner_b { 
    background-image: url('../images/banner_b.png') 
} 
+0

감사합니다. 하지만 이것은 현재 url에서만 작동하는 것 같습니다. 같은 쿼리 문자열을 포함하도록 모든 링크를 변경해야합니다. 내가 querystring을 유지할 수있는 방법이 있습니까? – StarCub

+0

nevermind, 세션에 저장하고 세션이 null인지 확인합니다. – StarCub

0

당신이 면도기를 사용하는 경우 (그리고 나는이 책임 가이드 라인의 분리를 중단하지 생각)을 수행 할 _ViewStart.cshtml 변경 . 그것이 미래의 요청 (레이아웃 + CSS + 자바 스크립트)가 모든 레이아웃 내에 업데이트 할 수 있기 때문에 매우 쉽게 만들기 때문에

@{ 
    if (/* Context.QueryString Params, not at my development box*/) 
    { 
     Layout = "~/Views/Shared/Layout-Group1.cshtml"; 
    } 
    else 
    { 
     Layout = "~/Views/Shared/Layout-Group2.cshtml"; 
    } 
} 

나는이 길을 선호합니다.

0

쿼리 문자열을 기반으로 표시 할 배너를 결정하기 위해 마스터 페이지에 일부 코드를 삽입하십시오. 코드가 완전히 인라인되지 않는 것이 이상적입니다. 즉, 헬퍼 클래스에 있어야합니다.

6

Custom Routing Handler을 작성하고 라우팅을 사용하여 querystring을 매개 변수로 추출하고 RouteData으로 전달하면 어디에서나 액세스 할 수 있습니다.

public class RouteWithQueryStringValueHandler : MvcRouteHandler 
{ 
    private readonly string key; 

    public RouteWithQueryStringValueHandler(string key) 
     : base() 
    { 
     this.key = key; 
    } 

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var request = requestContext.HttpContext.Request; 
     var qsValue = requestContext.HttpContext.Request[key]; 
     var router = base.GetHttpHandler(requestContext); 
     requestContext.RouteData.DataTokens[key] = qsValue; 
     return router; 
    } 
} 

등록을 다음과 같이

routes.Add(new Route("{controller}/{action}/{id}", 
       new RouteValueDictionary(
         new { controller = "Home", 
           action = "Index", 
           id = UrlParameter.Optional 
         }), 
       new RouteWithQueryStringValueHandler("bg"))); 

라우팅 데이터에 대한 로고를 가져 오기 :

var logo = RouteData.DataTokens["bg"]; 
+0

+1 대답을 수락 한 후 내 질문에 대답했습니다. – StarCub