我想在页面加载 c# 上使用它后清除我的查询字符串
I would like to clear my querystring after using it on page load c#
在我问这个问题之前,我什至不确定我使用的是查询字符串(我对此一无所知,我所拥有的是其他一些令人困惑的 Whosebug 研究的结果)。这是我通过超链接表达式从我的 SSRS 报告查看器传递到我的应用程序的参数。它有效,一切都很好,除了我想在之后立即从 url 中清除它。
http://10.155.54.101/Update?CurrencyId=67
我在页面加载时使用此逻辑获取参数。
if (Request.Params["CurrencyId"] != null)
int CurrencyId = int.parse(Request.Params["CurrencyId"]);
我正在成功捕获该信息并用它填充 asp.net 控件,但我现在想从地址栏中清除它,因为它在提交更新后仍然存在(回发?)。
通过另一个 Stack Overflow Answer: Clear QueryString on PostBack ,我试图通过以下代码清除查询字符串。
Request.Params.Clear();
但是我得到一个collection is read-only 错误,这在上面的堆栈溢出问题中得到了解决。因此,我尝试使用 System.Reflection 来更改集合的只读 属性,代码如下。
PropertyInfo Isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
Isreadonly.SetValue(Request.Params, false, null);
Request.Params.Clear();
我没有收到错误,但没有删除任何内容,所以我可能没有正确引用查询字符串,因为 Request.Params 工作正常。
有人可以用这个把我推向正确的方向吗?很抱歉我对此一窍不通。
您不能只更改浏览器地址栏中的 URL。您可以在没有查询字符串的情况下将浏览器重定向到 URL,但是看到您如何使用该值来填充正在呈现的页面上的控件,这意味着您仍然需要拥有该值。
当您说 "it lingers after submitting the update" 时,您的意思是用户选择货币并被重定向到包含此查询字符串的页面吗?如果可以,您能否将此操作更改为 POST 而不是 GET?然后您可以将 currencyId 放在 POST 的正文中。如果您不能将其切换为 POST,那么我在下面列出了一些想法。
如果您正在使用会话,则可以将 currencyId 存储在用户的会话中。但这只有在您需要在其他请求上使用该值时才有意义;因为使用会话是一个重大决定,如果您可以让您的网站保持无状态,那么您应该这样做。
话虽如此,有两种可行的选择可以让您的网站保持无状态。如果您在以后的请求中需要此值,可以将其存储在 cookie 中。如果您只在这个请求中需要它,您可以让页面对 URL 执行 post 而无需查询字符串,但值在 POST 正文中。
在我问这个问题之前,我什至不确定我使用的是查询字符串(我对此一无所知,我所拥有的是其他一些令人困惑的 Whosebug 研究的结果)。这是我通过超链接表达式从我的 SSRS 报告查看器传递到我的应用程序的参数。它有效,一切都很好,除了我想在之后立即从 url 中清除它。
http://10.155.54.101/Update?CurrencyId=67
我在页面加载时使用此逻辑获取参数。
if (Request.Params["CurrencyId"] != null)
int CurrencyId = int.parse(Request.Params["CurrencyId"]);
我正在成功捕获该信息并用它填充 asp.net 控件,但我现在想从地址栏中清除它,因为它在提交更新后仍然存在(回发?)。
通过另一个 Stack Overflow Answer: Clear QueryString on PostBack ,我试图通过以下代码清除查询字符串。
Request.Params.Clear();
但是我得到一个collection is read-only 错误,这在上面的堆栈溢出问题中得到了解决。因此,我尝试使用 System.Reflection 来更改集合的只读 属性,代码如下。
PropertyInfo Isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
Isreadonly.SetValue(Request.Params, false, null);
Request.Params.Clear();
我没有收到错误,但没有删除任何内容,所以我可能没有正确引用查询字符串,因为 Request.Params 工作正常。
有人可以用这个把我推向正确的方向吗?很抱歉我对此一窍不通。
您不能只更改浏览器地址栏中的 URL。您可以在没有查询字符串的情况下将浏览器重定向到 URL,但是看到您如何使用该值来填充正在呈现的页面上的控件,这意味着您仍然需要拥有该值。
当您说 "it lingers after submitting the update" 时,您的意思是用户选择货币并被重定向到包含此查询字符串的页面吗?如果可以,您能否将此操作更改为 POST 而不是 GET?然后您可以将 currencyId 放在 POST 的正文中。如果您不能将其切换为 POST,那么我在下面列出了一些想法。
如果您正在使用会话,则可以将 currencyId 存储在用户的会话中。但这只有在您需要在其他请求上使用该值时才有意义;因为使用会话是一个重大决定,如果您可以让您的网站保持无状态,那么您应该这样做。
话虽如此,有两种可行的选择可以让您的网站保持无状态。如果您在以后的请求中需要此值,可以将其存储在 cookie 中。如果您只在这个请求中需要它,您可以让页面对 URL 执行 post 而无需查询字符串,但值在 POST 正文中。