[英]How can I share data between multiple user controls?
我有 3 个用户控件,每个控件都需要根据各种 URL 参数等从 XML 提要中提取数据。 现在,对于所有 3 个用户控件,此 XML 源中的数据将相同,因为它们都发送相同的请求。
对相同的数据提出 3 个单独的请求似乎很愚蠢。
我的想法是有一个 singleton 我会调用它,它将向 XML 服务发出一个请求,然后向用户控件提供很好的解析结果。
IE:
现在我想起来了,我需要在“发出请求”方法中添加某种阻塞,这样我就不会同时多次调用它——我对 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.