繁体   English   中英

如何在多个用户控件之间共享数据?

[英]How can I share data between multiple user controls?

我有 3 个用户控件,每个控件都需要根据各种 URL 参数等从 XML 提要中提取数据。 现在,对于所有 3 个用户控件,此 XML 源中的数据将相同,因为它们都发送相同的请求。

对相同的数据提出 3 个单独的请求似乎很愚蠢。

我的想法是有一个 singleton 我会调用它,它将向 XML 服务发出一个请求,然后向用户控件提供很好的解析结果。

IE:

  1. 用户控件 A 抓取 singleton。
  2. 用户控件 A 要求 singleton 发出请求...
  3. Singleton 发出请求并将 XML 解析为各种属性。
  4. 用户控件 C 抓取 singleton 并将其数据拉出。
  5. 用户控件 A 从 singleton 中提取其数据。
  6. 用户控件 B 抓取 singleton 并将其数据拉出。

现在我想起来了,我需要在“发出请求”方法中添加某种阻塞,这样我就不会同时多次调用它——我对 C# 还很陌生,最简单的方法是什么?做这个? 用户控件甚至可以同时运行吗? 在某个地方有一个很好的概述吗?

问题是“singleton 是否会在 C# 中的页面请求之间重新实例化?”,但我想一个更普遍的问题是“我在做一件愚蠢的事情”,“什么是最好的方法?” 或“有没有更简单的方法来做我想做的事?”。

作为一般规则,如果我的直觉是 Singleton 我认为我做错了(正如你也直觉的那样)。

如果您希望每个页面请求有一个 XML 请求,并且要在控件之间共享数据,我会这样做:

public class Page : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    { 
        string data = DoXMLRequest();
        ucControl1.Data = data;
        ucControl2.Data = data;
        ucControl3.Data = data;
    }
}

确保每个控件都具有由您的 XML 请求代码(在此示例中为字符串)返回的类型的公共属性。

以供参考:

页面 object 调用页面 object 上的 OnLoad 方法,然后递归地对每个子控件执行相同操作,直到加载页面和所有控件。 单个控件的 Load 事件发生在页面的 Load 事件之后。

来自: ASP.NET 页面生命周期概述(应该作为一个很好的概述)。

如何使用 HttpContext.Items 请参阅http://www.4guysfromrolla.com/articles/060904-1.aspx

singleton 会在 C# 的页面请求之间重新实例化吗?

不会。只要 class 位于 memory 中,static 值就会在页面请求、会话和用户中持续存在。 这类似于将某些内容放入应用程序缓存中。 更好的解决方案首先是 session(每个用户),然后是 HttpCache(特别是因为能够使值过期),最后(如果你绝对必须)一个真正的 singleton。 如果要按页面重新创建此数据,请按照 MattMitchell 的建议在 Page_Load 中构建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM