2011-09-08 121 views
3

我正在爲兩個業務組構建通用Web應用程序。標識/橫幅需要根據查詢字符串進行更改。例如,如果網址爲http://foo.com/test?bg=a,它將顯示業務組a的徽標,如果網址爲http://foo.com/test?bg=b,則會顯示業務組b的徽標。如果我只有一個動作,這不是問題。但我有很多行動。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

感謝。但這似乎只適用於當前的網址。我需要更改所有鏈接以包含相同的查詢字符串。有什麼辦法可以堅持querystring? – StarCub

+0

沒關係,我意識到我可以將它保存在會話中,並檢查會話是否爲空。 – 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"; 
    } 
} 

我更喜歡這條路線,因爲它使任何未來的請求(layout + css + javascript)都相當簡單,因爲它們都可以在Layout中更新。

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