2011-09-08 10 views
3

私は2つのビジネスグループのための一般的なWebアプリケーションを構築しています。クエリーストリングに基づいてロゴ/バナーを変更する必要があります。たとえば、URLがhttp://foo.com/test?bg=aの場合、ビジネスグループaのロゴが表示され、URLがhttp://foo.com/test?bg=bの場合は、ビジネスグループbのロゴが表示されます。私は1つだけの行動があった場合、これは問題ではありません。しかし、私には多くの行動があります。Asp.net MVC 3グローバルクエリ文字列ですか?

すべての操作でクエリ文字列を確認できましたが、それを行うには良い方法が必要です。私はルーティングのもので何かをする必要があると知っていますが、方法はわかりません。誰でも私にそれをする方法を教えてもらえますか?

答えて

1

クエリ文字列パラメータに基づいて、指定されたクラス名をdivに追加するカスタムヘルパメソッドを記述することができます。もちろん、あなたのCSSファイルには、背景画像を適用した異なるクラス定義があります。例えば

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"; 
    } 
} 

してから_Layoutにあなたはdiv要素、あるいは身体のようないくつかのプレースホルダにこのクラスを適用することができます:

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

それは常にのために適用されます。この道をアプリケーション内のすべてのビュー

今残っているすべて異なるバナーのためのあなたの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でのみ機能するようです。私はすべてのリンクを同じクエリ文字列を含むように変更する必要があります。私がクエーストリングを維持できる方法はありますか? – StarCub

+0

nevermind、私はセッションでそれを保存し、セッションがnullであるかどうかを確認できることに気付きました。私は答えを受け入れた後、私の質問に答えるために+1 – StarCub

0

あなたはカミソリを使用している場合は(と私は、これは責任ガイドラインの分離を破るないと信じて)それを行うには_ViewStart.cshtmlを変更。

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

彼らはすべてのレイアウト内で更新することができますので、それはかなり簡単、将来の要求(レイアウト+ CSS + JavaScriptを)作るので、私はこのルートを好みます。

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

関連する問題