Передача DataContext в пользовательский элемент управления - PullRequest
0 голосов
/ 28 марта 2011

У меня есть страница, содержащая набор данных:

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

Я бы хотел передать этот текст данных в пользовательский элемент управления:

<%@ 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 ]

1 голос
/ 28 марта 2011

Вам не нужно передавать его на UserControl.DataContext Объекты недорогие в создании, поэтому, если вам нужен доступ к объекту, вы можете просто создать новый.

Однако, чтобы ответить на ваш вопрос напрямую, вы можете поделиться HttpContext -области DataContext среди всех пользовательских элементов управления, сохранив его в HttpContext.Items, например

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

Затем,Вы можете инициализировать поле в своем конструкторе, например, из своих элементов управления через

  _dataContext = (MyDataContext)Context.Items["DataContextKey"];

Более элегантная реализация этого подхода (и других подходов) для управления жизненным циклом DataContext в целом доступна на http://www.west -wind.com / weblog / posts / 246222.aspx , в классе 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;
}
0 голосов
/ 28 марта 2011

Определить интерфейс:

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 на странице, а не при загрузке.

НТН.

0 голосов
/ 28 марта 2011

Вероятно, вы можете добавить публичное свойство в свой пользовательский элемент управления и установить его со своей родительской страницы.

...