Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在所有请求中维护特定的查询字符串?_Asp.net Mvc_Request.querystring - Fatal编程技术网

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

Asp.net mvc 如何在所有请求中维护特定的查询字符串?,asp.net-mvc,request.querystring,Asp.net Mvc,Request.querystring,如果有人访问我们的网站时,查询字符串键为ref(例如mysite.com/AboutUs?ref=Test),是否可以在将来的所有链接/表单帖子上维护该查询字符串 例如,我可能在我们的网站上有一个链接,可以访问mysite.com/Products。我想把它翻译成mysite.com/Products?ref=Test 理想情况下,我想知道是否可以通过检查前一个URL并在请求页面时将其添加到当前URL,或者拦截路由并附加密钥(如果它不存在的话) 该项目是一个MVC4应用程序。在cookie中设置

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

例如,我可能在我们的网站上有一个链接,可以访问mysite.com/Products。我想把它翻译成mysite.com/Products?ref=Test

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


该项目是一个MVC4应用程序。

在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输出发送到浏览器之前对其进行处理;只需运行适当的正则表达式搜索并替换即可获得所需内容。e、 PHP有ob缓冲和相关函数。您可以使用.Net的等效项

在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输出发送到浏览器之前对其进行处理;只需运行适当的正则表达式搜索并替换即可获得所需内容。e、 PHP有ob缓冲和相关函数。您可以使用.Net的等效项

实际上,您可以通过将其添加到每个URL来传递它,但这需要手动添加到
Html.ActionLink
等的每次使用中(或者我想您可以创建一个自定义Html帮助器来为您实现这一点,但是在您的项目中工作的每个开发人员都需要记住始终使用自定义帮助器),以及控制器操作中的所有重定向等。不管是长是短,这都是非常耗时和脆弱的

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


要处理所有这些逻辑,最好创建一个全局操作过滤器。这是相当广泛的。创建过滤器后,只需在FilterConfig.cs(在App_Start中)中注册即可使其成为全局过滤器。

您实际上可以通过将其添加到每个URL来传递过滤器,但这需要手动添加到
Html.ActionLink
等的每次使用中。(或者我想你可以创建一个自定义HTML帮助器来为你做这件事,但是在你的项目中工作的每个开发人员都需要记住始终使用自定义帮助器),以及控制器操作中的所有重定向等。不管是长是短,这都是非常耗时而且非常脆弱的

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


要处理所有这些逻辑,最好的办法是创建一个全局操作筛选器。这是一个相当广泛的过程。一旦创建了筛选器,您只需在FilterConfig.cs(在App_Start中)中注册即可使其全局化。

谢谢。作为一个单独的问题,您为什么建议使用全局操作筛选器而不是对控制器应用筛选器?我之所以这样问,是因为对我来说,这似乎每页都要执行多次(我假设是因为PartialRender)。我建议使用全局筛选器,因为您说“所有未来的请求”。如果你不全局执行,那么你必须永远记住手动将筛选器添加到每个控制器,Murphy说你会忘记这样做。筛选器可能在一个视图中多次运行的原因很可能是由于子操作,MVC(相当愚蠢)将其视为一个完整的操作(包括路由和所有)即使它真的不是。但是,像这样的简单筛选器无论运行多少次都不会导致任何问题。如果它更复杂,您可能会有问题。谢谢。作为一个单独的问题,为什么您会建议使用全局操作筛选器而不是对控制器应用筛选器?我之所以这样问,是因为对我来说这似乎是一个问题每页执行多次(我假设是因为PartialRender)。我建议使用全局筛选器,因为您说的是“所有未来请求”。如果你不全局执行,那么你必须永远记住手动将筛选器添加到每个控制器,Murphy说你会忘记这样做。筛选器可能在一个视图中多次运行的原因很可能是由于子操作,MVC(相当愚蠢)将其视为一个完整的操作(包括路由和所有)即使它真的不是。但是,像这样的简单筛选器无论运行多少次都不会导致任何问题。如果它更复杂,您可能会有问题。此线程中的另一个答案建议会话状态,这对我来说是可行的,但我担心如果会话死亡,我将无法访问“Ref”。我有点喜欢cookie的想法,但我不知道调用它的正确时间。我似乎无法在正确的时间读取cookie值。忘记最后一条评论,我不恰当地使用了Request而不是Response。另一个