我有一个会话变量可以改变页面的外观。我有一个按钮,可以更改此会话变量的值。但是...... onClick事件发生在页面加载之后,所以当我根据按钮点击更新会话变量时,为时已晚,页面已经被加载。
理论上我可以将所有关于将显示更改为函数的逻辑并从页面加载调用它,然后在变量更新后再次从onclick调用它。但这是不切实际的:有许多用户控件检查值,在不同组合的许多不同页面上使用。我必须对每个页面上的用户控件列表进行硬编码,如果有人向特定页面添加了新的用户控件,他们必须记住更新此功能,这是蹩脚的。
有没有办法强制重新加载页面? (我可以使用response.redirect回到自己,它可以工作。如果一切都失败了,我想这就是我要做的。但这意味着额外的往返服务器,这是笨拙的。)
有没有办法在页面加载之前处理onclick?
其他一些神奇的解决方案?
答案 0 :(得分:3)
如果您必须根据可以更改的特定值更改页面的外观,那么您应该具有在单个统一位置设置外观的专用功能,然后您可以调用这些功能调用影响外观的值的每种情况。
示例:
private void SetDivVisibility()
{
// display logic here based on variables
}
private void MyControl_Click(...)
{
myvalue = blah;
SetDivVisibility();
}
有助于记住,在页面加载和事件处理之后,页面的实际呈现是最后发生的事情。
答案 1 :(得分:2)
理论上我可以将所有关于将显示更改为函数的逻辑并从页面加载中调用它
这就是你应该这样做的方式。清理你的逻辑和标记 - 重构并保持它DRY。这应该会有所帮助。
我可以使用response.redirect回复自己
这是另一种选择。是的,往返是令人讨厌的。
答案 2 :(得分:0)
您可以将您的页面样式代码放入page_load正常调用的空白处,然后再次从buttonclick调用
或将response.redirect调用到同一个网址
甚至onClick是客户端使用window.location.href
答案 3 :(得分:0)
具有布局的设计基于会话变量的存在,该会话变量在渲染之后才会存在,这是一个巨大的设计错误。我喜欢称它为“鸡或蛋”综合症。 (是的,你可以引用我......;)
我认为你的控件不应该在渲染中完成它们的布局。相反,使用一种方法(类似于数据绑定),您可以根据需要使用新的会话值“重新绑定”控件。此方法将根据更新的值显示/隐藏事物。