2011-09-08 124 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