значение по умолчанию в элементе управления сервером 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>

person MHF    schedule 07.09.2010    source источник


Ответы (3)


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

Вы должны иметь что-то в своем коде, которое содержит значение «KHT» в качестве значения по умолчанию. В этом Моя запись в блоге 2008 года.

Следующий код довольно рудиментарный, и я не смог убедиться, что он компилируется, но он должен дать вам некоторое представление о том, как вы могли бы справиться с «принудительным» значением ваших DefaultValueAttributes в 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");
}
person Rob    schedule 07.09.2010
comment
Спасибо за ответ, это работает, но только в режиме разработки. Есть ли способ добавить значение моего свойства по умолчанию в управляющий тег следующим образом: ‹cc1:KHTLabel ID=KHTLabel1 Key=KHT runat=server›‹/cc1:KHTLabel› - person MHF; 07.09.2010
comment
@MHF - Атрибут DefaultValue не сделает это за вас, и я ничего не знаю об этом. Это не то, для чего это нужно, и это довольно избыточно, так как это приведет к дублированию значений. - person Rob; 07.09.2010
comment
@MHF - мне просто интересно, если это значение по умолчанию, почему вы хотите видеть его в своей разметке? знак равно - person Rob; 07.09.2010
comment
это более дружелюбно к другим разработчикам, которые используют этот элемент управления :) - person MHF; 07.09.2010

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

person JOS    schedule 07.09.2010

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

Кстати, я не понимаю, почему у вас сейчас есть 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
    }
}
person comecme    schedule 19.11.2011