2011-09-28 93 views
0

我有一个会话变量,它改变了一些关于页面外观的事情。我有一个改变这个会话变量值的按钮。但是... onClick事件发生在页面加载后,所以当我更新基于按钮点击的会话变量时,已经太晚了,页面已经被加载。在asp.net中重新加载当前页面

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

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

Is there在页面加载之前处理onclick的方法?

一些其他的魔法解决方案?

+0

On_click在会话变量中设置值并为同一页面进行重定向调用Response.redirect(“YourPage.aspx”) –

+0

@EmaadAli - 阅读问题。该选项已被OP提及。 – Oded

+0

我知道。我有这个想法,所以我再次提到它。 –

回答

3

如果您必须根据可更改的特定值更改页面的外观和风格,那么您应该有专门的功能,在单一的统一位置设置外观,然后在每个调用影响外观和感觉的值的情况下调用这些函数。

例子:

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

} 

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

它有助于记住该页面的实际呈现是出现这种情况,无论是页面加载和事件处理后,最后一件事。

+0

捕捉到的是,大约有15个用户控件测试标志以改变它们的外观,而不同的页面使用不同的组合。因此,我必须保留每个页面上的控件的单独列表,以了解要修改哪些控件,并且在页面更改时必须更新。这似乎是一个等待发生的维护错误。 – Jay

+0

每个页面*已经*知道哪些控件住在它上面。因此,每个页面“SetDivVisibility”或“SetLookFeel”都可以包含对每个控件的“SetLookAndFeel”方法的调用。你的控件可以知道如何改变它们的外观,但是页面应该告诉它们什么时候测试以改变它们的外观,因为它是知道值何时改变的页面。 –

+0

好吧,显然ASP知道页面上的控件。有没有办法让我的手在名单上?当然,我仍然必须有一种方法来“追溯”确定哪些控制措施受到了国家变化的影响。其实我现在正在重构他们的用户控件,而不是没有特色的asp:超链接。 – Jay

2

理论上我可以把所有的逻辑有关更改显示成一个功能和页面加载

这就是你怎么应该做调用它。清理你的逻辑和标记 - 重构并保留它DRY。这应该有所帮助。

我可以使用Response.Redirect回到自己

那是另一种选择。是的,往返旅程令人讨厌。

0

你可以把你在通过在Page_Load通常被称为无效造型网页的代码,并从buttonclick

再次打电话或致电的Response.Redirect到相同的URL

甚至是的onClick客户端使用窗口.location.href

0

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

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

+0

我同意你所说的原则,但是如何?控件必须包含在aspx标记中。然后他们会在下载时间内完成构建。那么,我想我可以编写代码来动态地将它们添加到文档树中,与纯ASPX页面分开,但我真的不想这样做。我用一堆Javascript做了一次,它的工作,但它超级丑陋。 – Jay

+0

@Jay:看到Oded的回答。他死了。基本上,控件的属性应该在page_load期间设置。一旦设置了这些属性,就调用一个方法,使控件显示/隐藏他们需要的任何内容。 – NotMe