如何在所有请求中维护特定的查询字符串?

时间:2013-04-10 12:25:58

标签: asp.net-mvc request.querystring

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

例如,我可能在我们的网站上有一个链接转到mysite.com/Products。我希望将其翻译成mysite.com/Products?ref=Test。

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

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

2 个答案:

答案 0 :(得分:3)

您实际上可以通过将其添加到每个网址来传递它,但这需要手动添加到Html.ActionLink等的每次使用(或者我想您可以创建一个自定义HTML帮助程序来执行此操作但是,然后每个开发项目的开发人员都需要记住始终使用自定义帮助程序,以及控制器操作中的所有重定向等。无论长短,这都非常耗时且非常脆弱。

最好的办法是简单地使用querystring参数拦截初始请求,然后设置会话变量。然后,您只需检查是否存在会话var而不是querystring参数。

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

答案 1 :(得分: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。