Наследование ASP.NET UserControl - PullRequest
       11

Наследование ASP.NET UserControl

0 голосов
/ 25 февраля 2009

У меня есть UserControl, который работает нормально. Объявлено так.

public partial class DynamicList : System.Web.UI.UserControl
{
        protected static BaseListController m_GenericListController = null;

        public DynamicList()
        {
            m_GenericListController = new GenericListController(this);
        }
}

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

public partial class JobRunningList : DynamicList
{
    public JobRunningList()
    {
        m_GenericListController = new JobListController(this);
        (m_GenericListController as GenericListController).ModuleId = 14;
    }
}

Похоже, что элементы управления в DynamicList не создаются, хотя, когда я использую элемент управления JobRunningList, теперь получаю предсказуемо плохие результаты. DynamicList UserControl имеет ListView и несколько других элементов управления. Похоже, они не создаются при использовании JobRunningList. Есть ли в этом секрет?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2009

Если я правильно понимаю, вы хотите, чтобы интерфейс был таким же. В этом случае я бы создал несколько свойств. Возможно, просто простое перечисление, т.е. ListType.

0 голосов
/ 26 февраля 2009

Скучным обходным решением было бы сделать JobRunningList простым старым пользовательским элементом управления, который содержит DynamicList и просто устанавливает свойства внутреннего элемента управления в его OnLoad. Это неудобно, если у DynamicList есть много других свойств, к которым вы хотите получить доступ со страницы, поскольку JobRunningList должен был бы определять собственные соответствующие свойства. Возвращаясь к наследственному подходу, затем ...

Класс DynamicList просто содержит код, лежащий в основе логики, поэтому то, что вы делаете, работает хорошо, если вы хотите, чтобы второй элемент управления повторно использовал логику, стоящую за первым, но предоставлял новый собственный интерфейс.

Разметка в вашем файле .ascx компилируется в другой класс, который наследует DynamicList, поэтому, если вы можете заставить свой класс JobRunningList наследовать этот класс вместо DynamicList, вы получите желаемый результат. Этот класс получает имя по умолчанию, полученное из имени файла, но вы можете не догадываться об этом, установив ClassName в директиве control для использования вместо автоматического имени.

Возьмите простой базовый элемент управления, как

<%@ Control Language="C#" AutoEventWireup="true"
            CodeFile="HelloControl.ascx.cs" Inherits="HelloControlBase"
            ClassName="MyControls.HelloControl" %>

Hello <%= Name %>

с неинтересным кодом вроде

public partial class HelloControlBase : System.Web.UI.UserControl
{
    public string Name
    {
       get;
       set;
   }
}

Теперь мы хотим переопределить свойство Name в новом элементе управления. Сначала нам нужен HelloAlice.ascx

<%@ Control Language="C#" AutoEventWireup="true"
            CodeFile="HelloAliceControl.ascx.cs"
            Inherits="HelloAliceControl" %>

Не так много, чтобы увидеть здесь, так как мы оставляем всю работу на оригинальный ascx. Теперь в коде позади,

public partial class HelloAliceControl : MyControls.HelloControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Name = "Alice";
    }
}

Мы просто наследуем MyControls.HelloControl и устанавливаем свойство Name, и похоже, что мы закончили.

Проблема в том, что MyControls.HelloControl виден. Пока ваш производный элемент управления находится в том же каталоге, что и родительский элемент управления, вы, вероятно, будете в порядке, в противном случае довольно легко столкнуться с ошибками сборки, жалующимися на то, что класс не существует, поскольку родительский элемент управления еще не скомпилирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...