我的默认值属性存在问题。
当我在设计模式下将控件添加到页面时,默认值不起作用。这是我的代码:
[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>
答案 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
}
}