将DataContext传递给用户控件

时间:2011-03-28 13:39:19

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

我有一个包含数据集的页面:

protected void Page_Load(object sender, EventArgs e) {
     MyDefinedDataContext mydatacont = new MyDefinedDataContext();
}

我想将这个datacontext传递给用户控件:

<%@ Page Language="C#" MasterPageFile="~/Site2.Master" Inherits="WebApplication3._Default" %>
<%@ Register src="inc/Tabular.ascx" tagname="Tabular" tagprefix="testing" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <testing:Tabular ID="tabularArticles" runat="server" currentPage="3" title="Articles"/>
</asp:Content>

我该怎么做?我会以某种方式在用户控件的Page_Load中执行此操作吗?

protected void Page_Load(object sender, EventArgs e)
    {
        myCtx = mydatacont;
        this.setPreInfo();
        this.getTableInfo();
        this.setTableMeta();
    }

3 个答案:

答案 0 :(得分:1)

您无需将其传递给UserControlDataContext对象的创建成本很低,因此如果您需要访问该对象,则可以实例化一个新对象。

但是,要直接回答您的问题,您可以将所有用户控件中的HttpContext - 范围DataContext存储在HttpContext.Items中,例如

  HttpContext.Items["DataContextKey"] = new MyDataContext();

然后,您可以通过

从控件中初始化构造函数中的字段
  _dataContext = (MyDataContext)Context.Items["DataContextKey"];

http://www.west-wind.com/weblog/posts/246222.aspx课程DataContext课程中提供了一种更为优雅的用于管理DataContextFactory生命周期的方法(以及其他方法)。

您最感兴趣的方法是:

static object GetWebRequestScopedDataContextInternal(Type type, string key, string connectionString)                                   
{
    object context;

    if (HttpContext.Current == null)
    {
        if (connectionString == null)
            context = Activator.CreateInstance(type);
        else
            context = Activator.CreateInstance(type, connectionString);

        return context;
    }

    // *** Create a unique Key for the Web Request/Context 
    if (key == null)
        key = "__WRSCDC_" + HttpContext.Current.GetHashCode().ToString("x") + Thread.CurrentContext.ContextID.ToString();

    context = HttpContext.Current.Items[key];
    if (context == null)
    {
        if (connectionString == null)
            context = Activator.CreateInstance(type);
        else
            context = Activator.CreateInstance(type, connectionString);

        if (context != null)
            HttpContext.Current.Items[key] = context;
    }

    return context;
}

答案 1 :(得分:0)

您可以在用户控件上放置一个公共属性,并从父页面设置该属性。

答案 2 :(得分:0)

定义界面:

public interface IDataContextPage
{
     MyDefinedDataContext DataContext { get; }
}

让页面实现此界面,并执行:

public class MyPage: Page, IDataContextPage
{
     public MyDefinedDataContext DataContext { get { return _context; } }
}

您的用户控件可以通过界面引用此页面。在UC中这样做:

protected void Page_Load(..)
{
    var uc = ((IDataContextPage)this.Page).DataContext;
}

我建议在页面的init事件中创建上下文,而不是加载。

HTH。