Asp.net MVC 3全局查询字符串?

Asp.net MVC 3全局查询字符串?,asp.net,asp.net-mvc,routing,query-string,Asp.net,Asp.net Mvc,Routing,Query String,我正在为两个业务组构建一个通用web应用程序。需要根据查询字符串更改徽标/横幅。例如,如果url是http://foo.com/test?bg=a它显示业务组a的徽标,如果url为http://foo.com/test?bg=b它显示了业务组b的徽标。如果我只有一个动作,这不是问题。但我有很多行动 我可以检查所有操作的查询字符串,但必须有一个很好的方法。我有一种感觉,我需要做一些路由的东西,但只是不知道如何。有人能告诉我怎么做吗?您可以编写一个基于查询字符串参数的自定义帮助器方法,将给定的类名附

我正在为两个业务组构建一个通用web应用程序。需要根据查询字符串更改徽标/横幅。例如,如果url是
http://foo.com/test?bg=a
它显示业务组a的徽标,如果url为
http://foo.com/test?bg=b
它显示了业务组b的徽标。如果我只有一个动作,这不是问题。但我有很多行动


我可以检查所有操作的查询字符串,但必须有一个很好的方法。我有一种感觉,我需要做一些路由的东西,但只是不知道如何。有人能告诉我怎么做吗?

您可以编写一个基于查询字符串参数的自定义帮助器方法,将给定的类名附加到某个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";
    }
}
然后在您的
\u布局中
可以将此类应用于某些占位符,例如div,甚至body:

<div class="@Html.BannerClass()">OK</div>
如果您正在使用Razor(我相信这确实打破了职责分离的指导原则),请更改
\u 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)都变得相当容易,因为它们都可以在布局中更新。

在母版页中放置一些代码,根据查询字符串决定显示哪个横幅。理想情况下,代码不会完全内联,即它会在助手类中。

您可以编写一个
自定义路由处理程序
,并使用路由将
查询字符串
提取为参数,并传递到
路由数据
,在那里可以在任何地方访问它

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

谢谢但这似乎只适用于当前url。我需要更改所有链接以包含相同的查询字符串。有什么方法可以持久化查询字符串吗?不管怎样,我意识到我可以将它保存在会话中并检查会话是否为null。
var logo = RouteData.DataTokens["bg"];