asp.net значения свойств по умолчанию для пользовательского элемента управления

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

На данный момент у него есть два [asp:textbox] на странице (foregroundColour и backgroundColour).

Я хочу, чтобы мой цвет переднего плана по умолчанию был "FFFFFF", а мой цвет фона - по умолчанию "000000", И я, пользователь, мог указать свои собственные начальные значения через тег.

<ucFontChooser id="testchooser" runat="server" foregroundcolor="AABBCC" />

У меня есть два свойства, которые привязаны к текстовым полям:

[DefaultValue("000000")]
public string ForegroundColor { get { return foregroundColorSelectorHex.Text; } set { foregroundColorSelectorHex.Text = value; } }
[DefaultValue("FFFFFF")]
public string BackgroundColor { get { return backgroundColorSelectorHex.Text; } set { backgroundColorSelectorHex.Text = value; } }

Обратите внимание, что я знаю, что DefaultValue предназначен только для окна свойств Visual Studio и фактически не устанавливает никакого значения.

Однако я попытался установить значение по умолчанию в конструкторе пользовательского элемента управления:

ForegroundColor = "000000"

Это дает мне исключение, потому что в конструкторе foregroundColorSelectorHex имеет значение null.

Поэтому, если я попытаюсь установить значение по умолчанию в событии OnInit или в *Page_Load*, оно просто всегда будет использовать заданное значение по умолчанию и установленное значение свойства "AABBCC" перезаписывается.

Каков правильный способ сделать то, что я пытаюсь?

Спасибо.


person Matthew    schedule 25.03.2011    source источник


Ответы (6)


После долгой отладки я придумал решение, которое делает именно то, что мне нужно.

public override string ID
{
    set
    {
        base.ID = value;
        InitializeProperties();
    }
}

protected void InitializeProperties()
{
    ForegroundColor = "000000";
    BackgroundColor = "ffffff";
    EnableBackgroundColor = false;
    PrimaryFont = "Arial";
    SecondaryFont = "Helvetica";
    TertiaryFont = "sans-serif";
}

платформа .NET вызовет mycontrol.ID = "bla", когда пользовательские элементы управления входят в контекст. Он вызывается ДО того, как содержащий элемент управления/страница считывает атрибуты тегов и устанавливает свойства.

Выглядит халтурно, но отлично работает.

person Matthew    schedule 29.03.2011

Я думаю, что полный ответ был бы слишком длинным, чтобы отвечать здесь, и он уже задокументирован в MSDN.

См. эту страницу: http://msdn.microsoft.com/en-us/library/ms972975.aspx

И найдите текст «Добавление свойств и методов в пользовательский элемент управления».

(Но все равно прочитайте всю статью, чтобы понять детали.)

Однако из кода в статье следует, как вернуть значение по умолчанию, если свойство имеет значение null. Предполагая, что у вас есть свойство с именем CategoryID, оно должно быть определено как:

public int CategoryID
{
   get
   {
      object o = ViewState["CategoryID"];
      if (o == null)
         return 0;   // return a default value
      else
         return (int) o;
   }
   set
   {
      ViewState["CategoryID"] = value;
   }
}

Вы можете использовать тот же шаблон для определения цвета.

person David    schedule 25.03.2011

Попробуйте сохранить значение свойства в состоянии просмотра, а затем установить .Text в Page_PreRender, например:

 public string ForegroundColor
 {
     get
     {
        if (ViewState["forecolor"] == null)
        {
            ViewState["forecolor"] = "000000";
        }
        return (string) ViewState["forecolor"];
     }
     set
        {
            ViewState["forecolor"] = value;
        }
}

protected override void OnInit(EventArgs e)
{
     this.PreRender += Page_PreRender;
     base.OnInit(e);
}

private void Page_PreRender(object sender, EventArgs e)
{
     foregroundColorSelectorHex.Text = ForegroundColor;
}
person TKTS    schedule 25.03.2011

Не уверен, что это сработает, но не могли бы вы сделать что-то подобное в своем page_load:

protected void Page_Load {
    if (String.IsNullOrEmpty(ForegroundColor))
         ForegroundColor = "FFFFFF";
}
person Jack Marchetti    schedule 25.03.2011
comment
Это слишком поздно присваивает значение в жизненном цикле страницы. - person Matthew; 29.03.2011

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

if(!Page.IsPostBack){
  //Initialize your values
  ForegroundColor = "FFFFFF";

}
person gbs    schedule 25.03.2011

Разве вы не можете создать свои foregroundColorSelectorHex и backgroundColorSelectorHex в конструкторе?

public string ForegroundColor {
   get { return foregroundColorSelectorHex.Text; } 
  set { foregroundColorSelectorHex.Text = value; } 
}

public string BackgroundColor {
  get { return backgroundColorSelectorHex.Text; } 
  set { backgroundColorSelectorHex.Text = value; } 
}

public FontChooser () {
  foregroundColorSelectorHex = new ColorSelector();
  backgroundColorSelectorHex = new ColorSelector();

  ForegroundColor = "FFFFFF";
  BackgroundColor = "000000";
}
person Martin    schedule 25.03.2011
comment
Я пробовал это, но asp.net просто создает новый ColorSelector() после вызова конструктора, поэтому оба объекта перезаписываются новым объектом. - person Matthew; 25.03.2011