Asp.net MVC 3全局查询字符串?
我正在为两个业务组构建一个通用web应用程序。需要根据查询字符串更改徽标/横幅。例如,如果url是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的徽标。如果我只有一个动作,这不是问题。但我有很多行动 我可以检查所有操作的查询字符串,但必须有一个很好的方法。我有一种感觉,我需要做一些路由的东西,但只是不知道如何。有人能告诉我怎么做吗?您可以编写一个基于查询字符串参数的自定义帮助器方法,将给定的类名附
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"];