在用户控件之间共享数据而无法访问Page类

时间:2015-03-20 01:16:17

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

我有两个用户控件,每个用户控件都需要调用相同的服务来获取一些数据。由于这两个用户控件位于同一页面上 - 这将导致两次调用服务,从性能角度来看这并不理想。

这些控件是CMS的一部分,因此我无法访问aspx页面 - 我的意思是,我无法向Page类添加属性并使用它。

我认为可以做到的一种方法是将数据存储在用户会话中。

因此,每个用户控件都会检查Session,如果它为null,它将调用该服务并填充Session。

除了使用会话之外,我有哪些选择?

编辑:每个用户控件都需要调用以下服务,该服务是CMS的一部分:

 var personalizationService = new PersonalizationService();
 var userSegments = personalizationService.GetUserSegments();
 //get data based on userSegments

问题是 - 这两个用户控件可以在同一页面上,但在某些时候用户可能决定删除其中一个用户控件,或者向页面添加第三个用户控件。

由于

1 个答案:

答案 0 :(得分:1)

这是一个坏主意。用户控件应该是自包含的,不了解其环境。想想网格视图。

.aspx的

<asp:GridView runat="server" id="GridView1" />
<asp:GridView runat="server" id="GridView2" />

背后的代码

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        DataTable dt = Database.GetDataTable();
        GridView1.DataSource = dt;
        GridView2.DataSoure = dt;
        GridView1.DataBind();
        GridView2.DataBind();
    }
}

GridView不会从会话中提取数据,你也不应该!而是在用户控件中设置一个属性以传递数据。

如果数据仅在当前页面之外具有相关性,那么您可能将其存储在会话中,但是用户控件不应该从会话中提取数据,您的页面应该提取数据来自Session并将其传递给用户控件

if(Session["ImportantData"] == null)
    {
    Session[ImportantData] = Database.GetImportantData();
    }
MyUserControl1.Data = Session["ImportantData"] as ImportantDataClass;
MyUserControl2.Data = Session["ImportantData"] as ImportantDataClass;

回应你的编辑...

var personalizationService = new PersonalizationService();
MyUserControl1.PersonalizationService = personalizationService;
MyUserControl2.PersonalizationService = personalizationService;

顺便说一句,你不应该new PersonalizationService();理想情况下,你应该从依赖注入中获取,所以你可以从集中位置交换实现。我倾向于使用Ninject,它可以进行属性注入。

[Ninject]
public IPersonalizationService personalizationService {get; set;}

protected void Page_Load(object sender, EventArgs e)
{
    MyUserControl1.PersonalizationService = personalizationService;
}