asp.net服务器控件中的默认值

时间:2010-09-07 08:46:38

标签: asp.net web-controls

我的默认值属性存在问题。

当我在设计模式下将控件添加到页面时,默认值不起作用。这是我的代码:

[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 个答案:

答案 0 :(得分:4)

这不是[DefaultValue]属性的作用,我担心。它的作用允许Visual Studio设计器(特别是“属性”网格)确定默认显示的内容,因此如何知道将值显示为粗体当它与默认不同时。

您的代码中包含值为“KHT”的默认值是由您决定的。 this 2008 blog posting of mine中有一些相关的细节。

以下代码相当简陋,我无法验证它是否已编译,但它应该让您知道如何处理“强制”DefaultValueAttribute s的值ViewState 1}}:

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");
}

答案 1 :(得分:2)

DefaultValueAttribute不用于设置属性的值。序列化程序使用它来确定它应该序列化值。您需要在构造函数(或OnInit)中为属性设置默认值。如果属性值与DefaultValueAttribute值匹配,则使用DefaultValueAttribute使序列化数据更小。

答案 2 :(得分:1)

您可以通过在<cc1:KHTLabel ID="KHTLabel1" runat="server" Key="KHT"></cc1:KHTLabel>中明确命名,在第一个答案(ToolboxDataAttribute)上获得您在评论中提到的结果。 要使其也是实际的默认值,您仍然必须在属性的getter中返回该值。它导致在你的班级中重复三次相同的值。

顺便说一句,我不明白为什么你的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
    }
}