【问题标题】:UpdatePanel and Labels更新面板和标签
【发布时间】:2009-07-16 03:18:49
【问题描述】:

我有一个更新面板,里面有一些控件。例如,我有一个标签、一个文本框和一个回发按钮。

我的标签文本是从资源文件中检索的,因此,在页面加载期间,我执行以下操作

Page_Load()
{
    If(!isPostBack)
    {
        Label.Text = //Resource value;
    }    
}

问题是,在通过按钮单击触发器回发后,标签的文本消失了,因为我认为必须重新设置资源?

对摆脱这种多余的标签回发有什么建议吗?因为我有多个控件,所以很难将所有文本框包装在一个更新面板等中......

干杯

【问题讨论】:

    标签: .net asp.net asp.net-ajax updatepanel


    【解决方案1】:

    标签文本值保留在视图状态中,除非您手动关闭了标签或父控件的视图状态。如果启用了视图状态,则不必重新分配标签的文本。

    如果您不想使用视图状态,但您是从资源动态分配值,那么您每次都需要手动设置标签的文本属性。被回发的页面不知道在运行时更改的标签值,除非它保持在视图状态中。

    为控件生成的 ViewState 很重,因为它还存储了标签控件的其他属性。如果只有值发生变化,您可能需要考虑仅将值存储在 ViewState 对象中并关闭标签控件的视图状态并在每次回发时手动进行连接。

    // Store it
    ViewState["YourLabel"] = "Text you want to store in the label.";
    
    // On postback make sure you are assigning it
    YourLabel.Text = Convert.ToString(ViewState["YourLabel"]);
    

    我认为您不会找到自动执行此操作的方法。您可以编写一个辅助函数来在每次回发时自动执行此操作,方法是遍历 ViewState 中的项目并假设您已将键命名为与您的控件相同,使用键的名称搜索任何标签控件并根据为该键存储的值自动分配文本。我从未真正尝试过这个,但它可能会以牺牲一点速度为代价。

    【讨论】:

    • 这正是我想要解决的问题,因为标签的“视图状态”是多余的,浪费带宽。
    【解决方案2】:

    您可以使用以下任何一种方法:

    • 关闭该控件的 ViewState。 EnableViewState="false" 并在每次页面加载时在代码中设置它。如果这只是像你说的从资源文件加载的字符串,不会有任何性能问题,所以不用担心。
    • 以声明方式设置控件的值(在 .aspx 文件中)。您可以使用<%$ ... %> 绑定语法。
    • Pre_init 阶段(在 ViewState 加载/开始跟踪之前)设置代码中的值。

    如果您按照应有的方式在 Web 服务器级别使用页面压缩,那么在每个响应中添加几个字节的文本并不是什么大问题。如果这个标签在中继器或类似的东西中使用 1000 次,它只会变得很糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2010-10-13
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多