значение по умолчанию в управлении сервером asp.net - PullRequest
4 голосов
/ 07 сентября 2010

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

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

[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>

Ответы [ 3 ]

4 голосов
/ 07 сентября 2010

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

В вашем коде есть что-то, что содержит значение "KHT" в качестве значения по умолчанию. В этой публикации в моем блоге за 2008 год есть .

.

Следующий код является довольно элементарным, и я не смог проверить его компиляцию, но он должен дать вам некоторое представление о том, как вы можете обработать «форсирование» значения ваших DefaultValueAttribute s в 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");
}
2 голосов
/ 07 сентября 2010

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

1 голос
/ 19 ноября 2011

Вы можете получить результат, который вы упомянули в своем замечании по этому первому ответу (<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
    }
}
...