【问题标题】:reload current page in asp.net在 asp.net 中重新加载当前页面
【发布时间】:2011-09-28 19:47:41
【问题描述】:

我有一个会话变量,它改变了关于页面外观的一些事情。我有一个按钮可以更改此会话变量的值。但是...... onClick 事件发生在页面加载之后,所以当我根据按钮点击更新会话变量时,已经太晚了,页面已经加载了。

理论上我可以将所有关于更改显示的逻辑放入一个函数中并从页面加载中调用它,然后在变量更新后从 onclick 再次调用它。但这是不切实际的:有许多用户控件检查值,在许多不同的页面上以不同的组合使用。我必须对每个页面上的用户控件列表进行硬编码,如果有人向特定页面添加了新的用户控件,他们必须记住更新这个函数,这很蹩脚。

有没有办法强制页面重新加载? (我可以使用 response.redirect 返回给自己,它可以工作。如果所有其他方法都失败了,我想这就是我要做的。但这意味着需要额外往返服务器,这很笨拙。)

有没有办法在页面加载之前处理onclick?

其他一些神奇的解决方案?

【问题讨论】:

  • 在 On_click 中设置会话变量中的值并对同一页面进行重定向调用 Response.redirect("YourPage.aspx")
  • @EmaadAli - 阅读问题。 OP 已提及此选项。
  • 我知道。我有这个想法,所以我再次提到它。

标签: asp.net vb.net


【解决方案1】:

如果您必须根据可以更改的特定值来更改页面的外观,那么您应该有专门的函数在一个统一的地方设置外观,然后您调用这些函数每一种情况都会调用影响外观的值。

例子:

private void SetDivVisibility()
{
  // display logic here based on variables

}

private void MyControl_Click(...)
{
   myvalue = blah;
   SetDivVisibility();
}

请记住,页面的实际呈现是在页面加载和事件处理之后发生的最后一件事。

【讨论】:

  • 要注意的是,大约有 15 个用户控件会测试标志以改变其外观,并且不同的页面使用不同的组合。因此,我必须单独列出每个页面上的控件列表,以了解要修改哪些控件,并且必须在页面更改时对其进行更新。这似乎是一个等待发生的维护错误。
  • 每个页面已经知道上面有哪些控件。因此,每个页面的“SetDivVisibility”或“SetLookFeel”都可以包含对每个控件的“SetLookAndFeel”方法的调用。您的控件可以知道如何更改它们的外观,但 PAGE 应该告诉它们何时测试以更改它们的外观,因为它是知道值何时更改的页面。
  • 嗯,显然 ASP 知道页面上的控件是什么。有没有办法让我的手在名单上?当然,我仍然必须有一种方法来“追溯”确定哪些控件受到状态更改的影响。实际上,我现在正在重构以使它们成为用户控件,而不是普通的 asp:hyperlink。
  • 得到一份清单?如果您在页面上工作,您应该知道该页面上有哪些控件,不是吗?我不确定我是否理解您的问题。
  • 当然,但是我有很多页面,其中包含许多受影响控件的组合。有些是嵌套在其他用户控件中的用户控件。是的,我可以浏览所有页面并找出每个页面上有哪些控件,然后在更新函数中对该列表进行硬编码。但是,如果几个月后其他人出现并修改了页面,他们必须记住更新此列表。这是一个等待解决的维护陷阱。
【解决方案2】:

理论上我可以把所有关于改变显示的逻辑放到一个函数中,然后从页面加载中调用它

这就是你应该这样做的方式。清理你的逻辑和标记——重构并保留它DRY。这应该会有所帮助。

我可以使用 response.redirect 回到我自己

这是另一种选择。是的,往返很糟糕。

【讨论】:

    【解决方案3】:

    您可以将您的页面样式代码放在 page_load 通常调用的 void 中,并从 buttonclick 再次调用

    或调用 response.redirect 到相同的 url

    甚至onClick都是客户端使用window.location.href

    【讨论】:

      【解决方案4】:

      基于会话变量存在的布局的设计在渲染之后才会存在,这是一个巨大的设计错误。我喜欢称其为“鸡或蛋”综合症。 (是的,你可以引用我的话.. ;)

      我认为你的控件不应该在渲染时完成它们的布局。相反,使用一种方法(类似于数据绑定),您可以根据需要使用新的会话值“重新绑定”控件。此方法将根据更新的值显示/隐藏内容。

      【讨论】:

      • 我同意你所说的原则,但是如何呢?控件必须包含在 aspx 标记中。然后他们将在加载时构建。好吧,我想我可以编写代码将它们与普通的 aspx 页面分开动态添加到文档树中,但我真的不想这样做。我曾经用一堆 Javascript 做到了这一点,它确实有效,但它非常丑陋。
      • @Jay:见 Oded 的回答。他死定了。基本上,控件的属性应该在 page_load 期间设置。一旦设置了这些属性,您就可以调用一个方法,使控件显示/隐藏它们需要的任何内容。
      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 2018-04-22
      • 2011-12-31
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      相关资源
      最近更新 更多