2010-09-07 4 views
4

У меня проблема с атрибутом значения по умолчанию.Значение по умолчанию в управлении сервером asp.net

Когда я добавляю свой элемент управления на страницу в режиме разработки, значение по умолчанию не работает. Это мой код:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:KHTLabel runat=server key=dfd></{0}:KHTLabel>")] 
public class KHTLabel : Label ,IKHTBaseControl 
{ 
    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("KHT")] 
    [Localizable(true)] 
    public string Key 
    { 
     get 
     { 
      String s = (String)ViewState["Key"]; 
      return ((s == null) ? String.Empty : s); 
     } 

     set 
     { 
      ViewState["Key"] = value; 
     } 
    } 

    protected override void RenderContents(HtmlTextWriter writer) 
    {...... 

Но в расчетном режиме, когда я добавить элемент управления на панели инструментов, ключ не существует

<cc1:KHTLabel ID="KHTLabel1" runat="server"></cc1:KHTLabel> 

ответ

4

Это не то, что делает атрибут [DefaultValue], я боюсь , Что он делает, это позволяет дизайнеру Visual Studio (в частности, сетке «Свойства») определить , что показать по умолчанию, и поэтому как узнать, чтобы показать значение как полужирный, когда он отличается от значения по умолчанию.

Вам нужно иметь что-то в своем коде, которое имеет значение «KHT» в качестве значения по умолчанию. В this 2008 blog posting of mine есть немного важной информации.

Следующий код зачаточном, и я не в состоянии проверить, компилирует, но это должно дать вам некоторое представление о том, как можно справиться с «заставляя» ценность ваших DefaultValueAttribute с в ViewState:

private string GetDefaultAttributeValueForProperty(string propertyName) 
{ 
    var attributesForProperty = (from prop in typeof(KHTLabel).GetProperties() 
       where prop.Name == propertyName 
       select System.Attribute.GetCustomAttributes(prop)).First(); 
    var defaultValueAttribute = (from attr in attributesForProperty 
       where attr.GetType() == typeof(DefaultValueAttribute) 
       select ((DefaultValueAttribute)attr).Value).FirstOrDefault(); 

    return Convert.ToString(defaultValueAttribute); 
} 
public KHTLabel() 
{ 
    ViewState["Key"] = GetDefaultAttributeValueForProperty("Key"); 
} 
+0

Thnks за ответ, это работа, но только в режиме конструктора, есть ли способ, что мое значение свойства по умолчанию добавить в теге элемента управления, как это: MHF

+0

@MHF - атрибут 'DefaultValue' ** не сделает этого для вас, и я ничего не знаю об этом. Это не то, что для этого и достаточно избыточно, так как это приведет к дублированию значений. – Rob

+0

@MHF. Мне просто интересно, если значение равно * default *, ** почему ** вы хотите увидеть его в своей разметке? =) – Rob

2

DefaultValueAttribute не используется для установки значения для свойства. Он используется сериализатором для определения того, как он должен сериализовать значение или нет. Вам нужно установить значение по умолчанию для свойства в конструкторе (или в OnInit). Использование параметра DefaultValueAttribute делает сериализованные данные меньше, если значение свойства соответствует значению DefaultValueAttribute.

1

Вы можете получить результат, о котором вы упомянули в своем замечании по этому первому ответу (<cc1:KHTLabel ID="KHTLabel1" runat="server" Key="KHT"></cc1:KHTLabel>), явно называя его в ToolboxDataAttribute. Чтобы сделать это также фактическим значением по умолчанию, вам все равно нужно вернуть это значение в getter свойства. Это приводит к дублированию одного и того же значения три раза в вашем классе.

BTW, я не понимаю, почему у вас в настоящее время есть key=dfd в вашем ToolboxData, а имя свойства - Key и имеет строку типа.

[DefaultProperty("Text")] 
[ToolboxData("<{0}:KHTLabel runat=server Key=\"KHT\"></{0}:KHTLabel>")] 
public class KHTLabel : Label//, IKHTBaseControl 
{ 
    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("KHT")] 
    [Localizable(true)] 
    public string Key 
    { 
     get 
     { 
      var s = (String)ViewState["Key"]; 
      return (s ?? "KHT"); 
     } 

     set { ViewState["Key"] = value; } 
    } 

    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     // TODO: Implement logic 
    } 
} 
Смежные вопросы