【问题标题】:How to use a Page variable in User Control?如何在用户控件中使用页面变量?
【发布时间】:2014-06-01 22:24:21
【问题描述】:

我有一个带有私有变量的页面:AccountData

这会处理所有帐户数据,我将其保存在回发之间的 viewstate 中。
我有一个名为 AccountFavorites 的用户控件,它呈现所有帐户收藏主题。

当用户决定要取消一个喜欢的主题时,他点击asp:LinkButton 并将其发回服务器以更改数据库中的值。

但是,控件不知道AccountData 是什么,只有页面知道。

如何在控件的回发中使用AccountData

我可以让回传转到页面吗?

【问题讨论】:

    标签: c# asp.net user-controls postback


    【解决方案1】:
    <myprefix:AccountFavorites runat="server" id="TheAccountFavorites" />
    

    在您的页面中设置信息...

    protected void Page_Load(object sender, EventArgs e)
    {
        TheAccountFavorites.TheAccountData=MyAccountData;//assuming you'll load up MyAccountData
    }
    

    在您的控制下,将 AccountData 公开为公共属性。这将允许您从页面访问它。

    public AccountData TheAccountData {get;set;}
    

    这是假设AccountData 是类型名称而不是其他东西,比如字符串。但是您可以将 AccountData 更改为字符串,它会起作用。

    【讨论】:

      【解决方案2】:

      因为它是拥有/父级用户控件的页面,所以最好让页面了解控件的细节,而不是相反。将AccountData 属性添加到控件并在页面的Page_Load 中执行:

      uc.AccountData = AccountData;
      

      【讨论】:

      • 谢谢,但我不需要将它添加到控件的 ViewState 中吗?或者你能提供另一个想法吗?
      • 不,控件的 ViewState 中不需要它。该控件将使用与页面相同的实例。您必须确保在页面从页面的 ViewState 中读取 AccountData 之后进行上述分配。此外,在控制代码中,添加防止 AccountData 为空(未设置)的预防措施。
      • 感谢@Igor,这对我帮助很大。如果可以的话,再问一个问题,我的控件位于页面的 ListView 中。这意味着在每次回发时我都必须重新绑定它,对吧?
      • 如果“重新绑定”是指“执行上述任务” - 那么是的。
      • 这不仅不明智,而且在第一次回发之后,您将拥有两个 AccountData 实例——一个由页面引用,另一个由控件引用。这将带来有趣且令人兴奋的调试。
      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多