我的团队正在为非常低端的“功能”手机构建一个简单的MVC网站。我们遇到的一个问题是某些手机会积极地缓存HTML,因此用户实际看到的并不是我们想要的。一个极端的例子是,用户注册并获得“谢谢页面”。然后,同一设备上的另一个用户尝试注册。手机只提供缓存页面而无需创建新帐户。
过去我通过在我不想缓存的事物中添加“缓存破坏者”查询字符串来解决这个问题,例如,所有页面都将以格式提供
http://domain.com/controller/route?cb=somerandomstringofnumbers
在这种情况下,我们需要对网站中的所有网址执行此操作 - 这包括由RedirectToAction
或Redirect
等控制器操作自动生成的网址以及Razor {{1 }},Url.Action
,Html.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
由于框架变化太大,我无法开始工作,但它看起来非常接近我想要实现的目标。
我觉得我在正确的区域,但是我碰到了一堵砖墙。
有什么建议吗?
答案 0 :(得分:0)
这已经很老了,但让我根据我如何解决类似的问题来回答:
将cb
作为路由值,而不是将其作为查询字符串,而action
和controller
是路由值。你可以通过注册路线来做到这一点;例如:
routes.MapRoute(
name: "CB",
url: "{cb}/{controller}/{action}/{id}",
defaults: new { cb = "3600", area = "", id = UrlParameter.Optional }
);
如果cb
的值不是常量,那么您可以找到一个方便的点来为每个用户会话设置cb
。成功登录后,一个好地方。有了这个,您现在需要为RedirectToAction
和ActionLink
提供两种自定义方法。您的实现将简单地打包RouteValueDictionary
,然后使用适当的重载将其传递给MVC自己的实现。