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

时间:2011-05-05 05:33:07

标签: c# asp.net

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

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

我的想法是拥有一个我将调用的单例,它将向XML服务发出一个请求,然后将精确解析的结果呈现给用户控件。

即:

  1. 用户控制A抓住单身人士。
  2. 用户控制A要求单身人士提出请求......
  3. Singleton发出请求并将XML解析为各种属性。
  4. 用户控制C抓取单例并将其数据拉出。
  5. 用户控制A将其数据从单例中拉出。
  6. 用户控制B抓取单例并将其数据拉出。
  7. 现在我考虑一下,我需要为“make a request”方法添加某种阻塞,这样我就不会同时多次调用它 - 我对C#很新,是什么最简单的方法吗?用户控件是否同时运行?这个地方有一个很好的概述吗?

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

3 个答案:

答案 0 :(得分:6)

作为一般规则,如果我的直觉是单身人士,我认为我做错了(因为你同样直觉)。

如果你想要每个页面请求一个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请求代码返回的类型的公共属性(在此示例中为字符串)。

供参考:

  

Page对象调用OnLoad   在Page对象上的方法,然后   递归地为每个人做同样的事情   孩子控制直到页面和所有   控件已加载。 Load的事件   个别控制发生在   加载页面的事件。

来自:ASP.NET Page Life Cycle Overview(应作为一个很好的概述)。

答案 1 :(得分:1)

  
    

是否会在C#中的页面请求之间重新实现单例?

  

没有。只要该类在内存中,静态值将在页面请求,会话和用户之间保持不变。它类似于在Application缓存中放置一些东西。一个更好的解决方案首先是会话(每个用户),然后是HttpCache(特别是因为能够使值过期),最后(如果你绝对必须)一个真正的单例。如果要在每页重新创建此数据,则在MattMitchell建议的Page_Load中构建它。

答案 2 :(得分:1)

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