【问题标题】:default value in asp.net server controlasp.net 服务器控件中的默认值
【发布时间】:2010-09-07 08:46:38
【问题描述】:

我的默认值属性有问题。

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

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

【问题讨论】:

    标签: asp.net web-controls


    【解决方案1】:

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

    您可以在您的代码中添加将值“KHT”作为默认值的内容。 this 2008 blog posting of mine 有一些相关的细节。

    以下代码相当初级,我无法验证它是否可以编译,但它应该让您了解如何处理将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");
    }
    

    【讨论】:

    • 感谢回复,它可以工作,但仅在设计模式下,我的属性默认值是否可以像这样添加到控制标签:
    • @MHF - DefaultValue 属性 不会 为您做到这一点,而且据我所知,没有任何事情会做到这一点。这不是它的用途,而且非常多余,因为它会导致重复值
    • @MHF - 我只是想知道,如果值是 default为什么你想在你的标记中看到它? =)
    • 对其他使用该控件的开发者更友好:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以通过在ToolboxDataAttribute 中明确命名来获得您在第一个答案(&lt;cc1:KHTLabel ID="KHTLabel1" runat="server" Key="KHT"&gt;&lt;/cc1:KHTLabel&gt;)的评论中提到的结果。 为了使这也成为实际的默认值,您仍然必须在属性的 getter 中返回该值。这会导致在您的班级中重复相同的值 3 次。

      顺便说一句,我不明白为什么你的ToolboxData 中现在有key=dfd,而属性名称是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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 2011-03-02
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        相关资源
        最近更新 更多