2013-04-10 17 views
0

如果有人使用ref的查询字符串键(例如mysite.com/AboutUs?ref=Test)访问我们的网站,是否可以在所有将来的链接/表单帖子上保留该查询字符串?如何维护所有请求中的特定查询字符串?

因此,例如,我可能会在我们的网站上有链接转到mysite.com/Products。我希望将其转换为mysite.com/Products?ref=Test。

理想情况下,我想知道这是否可以通过检查前一个URL并将其添加到当前的URL中,当对页面发出请求时,可能通过拦截路由并追加密钥(如果它不'已经存在)。

该项目是一个MVC 4应用程序。

回答

3

你可以通过将它添加到每一个URL来传递它,但这需要手动添加到每个使用Html.ActionLink等(或者我想你可以创建一个自定义的HTML帮助程序来为你做,但那么每个在你的项目中工作的开发人员都需要记住总是使用自定义帮助程序)以及控制器操作中的所有重定向等。总而言之,这将非常耗时且非常脆弱。

最好的办法是简单地用querystring参数截获初始请求,然后设置会话变量。然后,您可以简单地检查会话变量的存在,而不是查询字符串参数。

要处理所有这些逻辑,最好的办法是创建一个全局动作过滤器。有相当广泛的documentation on Filters at MSDN。一旦你创建了你的过滤器,你只需要在FilterConfig.cs中(在App_Start中)注册它就可以全局化。

+0

谢谢。就像一个单独的问题一样,为什么你会推荐一个全局动作过滤器,而不是对控制器应用过滤器?我只问,因为对我来说,这似乎每页执行多次(我假设是因为PartialRender的)。 –

+0

我推荐了一个全局过滤器,因为你说过“*所有*未来的请求”。如果你不全球化,那么你必须记得永远和永远地将过滤器手动添加到每个控制器,墨菲说你*会忘记这么做。过滤器可能在一个视图中多次运行的原因很可能是由于子操作,而MVC(相当愚蠢)视为完全成熟的操作(包括路由和全部),即使实际上并非如此。不过,像这样的简单过滤器不应该造成任何问题,无论它运行多少次。如果它更复杂,你可能会遇到问题。 –

1

在Cookie中设置URL参数,然后在您的代码中根据Cookie或URL中该值的存在性做任何您想要执行的操作。

if(parameter set in cookie OR URL) 
    // do stuff 
if(parameter set in URL) 
    // set the cookie so that future actions are also tagged with that parameter 

或者,如果您希望只为会话发生此类标记,请设置会话变量。

以您建议的方式来完成 - 您可以基于此标记重写您网页上的所有链接,但这将是一个迂回并且昂贵的方式。大多数语言允许一个钩子,它允许你的代码在发送给浏览器之前处理HTML输出;只需运行适当的正则表达式搜索并替换即可获得您想要的内容。例如PHP具有ob缓冲和相关功能。你可以使用.Net的等价物。

+0

在这个线程中的其他答案建议会话状态,这对我有用,但我担心,如果会话死亡,我将无法访问“参考”。我有点喜欢饼干的想法,但我无法弄清楚调用它的正确时间。我似乎无法在正确的时间读取cookie值。 –

+0

忘记最后一条评论,我不正确地使用Request而不是Response。 –

相关问题