Как установить свойство настраиваемого объекта в ASP.NET WebControl с помощью разметки

Я изо всех сил пытаюсь установить настраиваемое свойство, которое должно указывать на экземпляр моего настраиваемого класса в веб-элементе управления ASP.NET.

Пример веб-элемента управления:

public class CustomControl : System.Web.UI.WebControls.Panel
{
  public IFactory Factory { get; set; }
}

Код позади:

public partial class Main : System.Web.UI.Page
{        
  public IFactory GetFactory { 
    get { return new CustomFactory(); } 
  }
}

public class CustomFactory : IFactory {}

Пользовательская фабрика инициализируется на основе кода. В моей разметке (а не в коде позади) мне нужно установить свойство Factory в моем CustomControl на экземпляр в моем коде позади. Любые варианты встроенного кода, которые я пробовал, не работали:

<asp:CustomControl ID="MyCustomControl" Factory="<%GetFactory%>" runat="server" />
<asp:CustomControl ID="MyCustomControl" Factory="<%=GetFactory%>" runat="server" />

Может ли кто-нибудь помочь, как это сделать?


person BlueChameleon    schedule 03.10.2012    source источник
comment
Почему это должно быть в разметке?   -  person Dave Zych    schedule 03.10.2012
comment
Чтобы код был чище.   -  person BlueChameleon    schedule 03.10.2012
comment
Я не уверен, что это веская причина - пытаясь сохранить код более чистым, вы портите разметку. Я не обязательно понимаю, как добавление одной строчки кода делает код запутанным.   -  person Dave Zych    schedule 03.10.2012
comment
Я думал, что пользователь помещает элемент управления в aspx и устанавливает все его свойства там, и ему не нужно переходить к исходному коду, чтобы сделать что-нибудь еще.   -  person BlueChameleon    schedule 03.10.2012


Ответы (1)


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

<%MyCustomControl.Factory = this.GetFactory;%>
person danielQ    schedule 03.10.2012
comment
Я пробовал это, но в OnInit настраиваемого элемента управления свойство Factory имеет значение null. Выполняется ли приведенный выше код в OnPreRender? - person BlueChameleon; 03.10.2012
comment
Не имеет значения, имеет ли свойство Factory значение null, потому что вы устанавливаете его значение на this.GetFactory. Что может быть null, так это контроль. Чтобы лучше понять это, посмотрите, что происходит на жизненный цикл страницы (см. раздел Обработка) - person danielQ; 03.10.2012
comment
Я пытался сказать, что могу сделать то, что вы предложили, но это назначение произойдет после события OnPreRender, а для меня это уже слишком поздно. - person BlueChameleon; 04.10.2012