【问题标题】:How to clear/change the query string in aspx page?如何清除/更改 aspx 页面中的查询字符串?
【发布时间】:2014-05-02 10:37:36
【问题描述】:

我有两页 1. a.aspx 和 2.b.aspx 我将查询字符串从“b.aspx?save=success”传递给 a.aspx。 在 a.aspx 的页面加载中,我有以下代码:

Page_Load()
{ 
    if(!Postback)
    {
        if (Request.QueryString["save"] != null) 
        {
            noDataFound.InnerHtml = "operation success";
        }
    }
}

问题:在加载 a.aspx 页面时,我收到消息“操作成功”。没关系。但是当我再次刷新页面时,我收到与“操作成功”相同的消息。如何在页面刷新时不再显示相同的消息(按 F5 或重新加载)。

【问题讨论】:

  • 是的。 Page_Load(){ if(!Postback){if (Request.QueryString["save"] != null) {noDataFound.InnerHtml = "操作成功";}}}
  • 因为 URL 基本上保持不变,这就是为什么您不断看到成功消息的原因。
  • Patrick Hofman 发现了这个问题。他的回答很好。

标签: c# asp.net .net query-string


【解决方案1】:
function invokeMeMaster() {

    var isPostBack = <%= Page.IsPostBack ? "true" : "false" %> ;

    if (!isPostBack) {

        /* START */
        var query = getQueryParams(document.location.search);

        var p = query.save;
        if (sessionStorage.hits) {
            sessionStorage.hits = Number(sessionStorage.hits) + 1;
        } else {
            sessionStorage.hits = 1;
        }

        if (p == "success" && (sessionStorage.hits) % 2 == 0) {

            document.getElementById("<%=noDataFound.ClientID %>").innerText = "Testing...........";
        }

        function getQueryParams(qs) {
            qs = qs.split("+").join(" ");

            var params = {}, tokens,
            re = /[?&]?([^=]+)=([^&]*)/g;

            while (tokens = re.exec(qs)) {
                params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
            }

            return params;
        }

        /* END */

    } else {
        document.getElementById("<%=noDataFound.ClientID %>").innerText = "";

    }
}
window.onload = function () {
    invokeMeMaster();
};

【讨论】:

  • 通过客户端完成。不建议在 .cs 页面中使用会话。虽然我在这里使用 SessionStorage,但它也不能完全解决我的问题,因为它只是比较计数。
【解决方案2】:

未经测试的解决方案(Keeping F5 or Reload of Page in mind),可能你已经做了如下的事情:

if(!IsPostBack)
{ 

  if (Request.QueryString["save"] != null && Session["CheckSuccess"] == null)
  { 
    noDataFound.InnerHtml = "operation success";
    Session["CheckSuccess"] = "true";
  } 
  else
    noDataFound.InnerHtml = string.Empty;
}

【讨论】:

  • 除了使用Session之外还有什么办法,因为它使页面变得沉重。
  • 我认为保持状态Session 是好的。它不会在页面加载方面产生任何差异。
  • 或者我们可以将查询字符串存储在某个集合中吗?
  • 当然你可以维护NameValueCollection。但是你每次都会有相同的键/值,除非你用不同的查询字符串调用你的页面。
  • F5 将只发送与第一次相同的数据,确定已经处理的请求应该在服务器上。如果您希望页面为空,则使用会话是一个很好的解决方案。然而,再次显示“操作成功”只是 Web 的工作方式,添加会话内容会使您的页面更加复杂,并且将来可能会引入令人讨厌的错误。顺便说一句,将内容放入查询字符串会使您的 Web 应用程序容易受到 xss 和注入的攻击。
【解决方案3】:

我能想到的最好的方法是使用IsPostback 属性来检查。

if (!this.IsPostback)
{
    // first try
   if (Request.QueryString["save"] != null)
   {noDataFound.InnerHtml = "operation success";}
}

注意:IsPostback 未设置为刷新,仅当单击按钮或类似内容触发 ASP.NET 回发操作时。

您可以做的另一件事是设置一个 Session 变量,然后必须显示“操作成功”(可能您在另一个 Page 中确定这一点。

// other page
Session["showSaveMessage"] = true;

// this page
if (Session["showSaveMessage"] == true)
{
    // show message
    Session["showSaveMessage"] = false;
}

第三种选择是移动这个客户端。在页面加载时创建一个 javascript 操作。将特定部分添加到查询字符串 (#showmessage) 时,您可以捕获该部分并显示消息 (How to get the value from the GET parameters?)。

然后通过将 url 设置为剥离版本来重定向到无参数版本 (#)。为此设置window.location.hrefwindow.location.search(这不会导致对网络服务器的调用,因为它都是客户端)。

这规避了第一种解决方案的缺点,但引入了更多代码客户端。幸运的是,ASP.NET MVC 对此有一些机制。不幸的是 ASP.NET Web 窗体没有这些。

【讨论】:

  • OP 实际上有 IsPostback 检查到位。奇怪的是它不起作用
  • 我已经有这样的了。if (!IsPostBack) { if (Request.QueryString["Save"] != null) { noDataFound.InnerHtml = "操作成功"; } }
  • @Yahya:为此添加了解释。请参阅注释
  • @PatrickHofman 当然用户只是令人耳目一新!很好的收获。
  • 是的,Dude.Using Session 不是首选,收集工作不正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多