ASP.NET MVC5 - 将查询字符串附加到所有URL

时间:2015-06-18 13:52:53

标签: c# asp.net-mvc

我的团队正在为非常低端的“功能”手机构建一个简单的MVC网站。我们遇到的一个问题是某些手机会积极地缓存HTML,因此用户实际看到的并不是我们想要的。一个极端的例子是,用户注册并获得“谢谢页面”。然后,同一设备上的另一个用户尝试注册。手机只提供缓存页面而无需创建新帐户。

过去我通过在我不想缓存的事物中添加“缓存破坏者”查询字符串来解决这个问题,例如,所有页面都将以格式提供

http://domain.com/controller/route?cb=somerandomstringofnumbers

在这种情况下,我们需要对网站中的所有网址执行此操作 - 这包括由RedirectToActionRedirect等控制器操作自动生成的网址以及Razor {{1 }},Url.ActionHtml.BeginForm等。

现在很明显我可以装饰Razor HTML助手(或扩展它们)并将参数添加到控制器动作中,但在我看来,因为这些内置方法生成的实际URL是从Controller /自动生成的行动参数传入后,应该有办法劫持这个过程。

不幸的是,MS类受到保护 - 我主要是在查看System.Web.Routing.Routes。

我尝试了一些我在网上找到的东西,但它们不是MVC5(可追溯到2008年),而且似乎框架发生了重大变化。

例如,来自 http://forums.asp.net/t/1216840.aspx?Append+value+to+all+urls+built+by+RouteCollection+GetUrl

Html.ActionLink

由于框架变化太大,我无法开始工作,但它看起来非常接近我想要实现的目标。

我觉得我在正确的区域,但是我碰到了一堵砖墙。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这已经很老了,但让我根据我如何解决类似的问题来回答:

cb作为路由值,而不是将其作为查询字符串,而actioncontroller是路由值。你可以通过注册路线来做到这一点;例如:

 routes.MapRoute(
     name: "CB",
     url: "{cb}/{controller}/{action}/{id}",
     defaults: new { cb = "3600", area = "", id = UrlParameter.Optional }
 );

如果cb的值不是常量,那么您可以找到一个方便的点来为每个用户会话设置cb。成功登录后,一个好地方。有了这个,您现在需要为RedirectToActionActionLink提供两种自定义方法。您的实现将简单地打包RouteValueDictionary,然后使用适当的重载将其传递给MVC自己的实现。