我想在页面加载c#上使用它后清除我的查询字符串

时间:2017-02-22 20:35:38

标签: c# asp.net reporting-services system.reflection

在我提出这个问题之前,我甚至不确定我使用的是一个查询字符串(我对此非常无能,我所拥有的是其他一些令人困惑的StackOverFlow研究的结果)。这是我通过超链接表达式从我的SSRS报表查看器传递到我的应用程序的参数。它很有效,一切都很棒,除非我想在之后从网址中清除它。

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();

但我得到的集合是只读错误,这是在上面的堆栈溢出问题中解决的。所以我尝试使用System.Reflection来使用以下代码更改集合的只读属性。

PropertyInfo Isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
                Isreadonly.SetValue(Request.Params, false, null);
                Request.Params.Clear();

我没有收到错误,但没有删除任何内容,因此我可能无法正确引用查询字符串,因为heck Request.Params可以正常工作。

有人能用这个推动我朝着正确的方向前进吗?我很抱歉,我对此毫无头绪。

1 个答案:

答案 0 :(得分:2)

您无法更改浏览器地址栏中的网址。您可以将浏览器重定向到不带查询字符串的URL,但是看看如何使用该值来填充正在呈现的页面上的控件,这意味着您仍然需要具有该值。

当您说"它在提交更新"后徘徊时,您是指用户选择货币并重定向到包含此查询字符串的页面?如果是这样,你可以将此操作更改为POST而不是GET吗?然后你可以将currencyId放在POST的主体中。如果您无法将其切换到POST,那么我在下面列出了一些想法。

如果您正在使用会话,则可以将currencyId存储在用户的会话中。但是,如果您需要在其他请求中使用此值,那只会有意义;因为使用会话是一个重大决定,如果你可以保持你的网站无国籍你应该。

话虽如此,有两种可行的选择可以使您的网站保持无状态。如果您在将来的请求中需要此值,则可以将其存储在cookie中。如果您只是在此请求中需要它,您可以让页面发布到URL而不使用查询字符串,但在POST正文中使用值。