3

我在页面上定义了一个用户控件,如下所示:

<uc:MyUserControl ID="MyUserControl" runat="server" Visible="true" />

我想在具有自定义属性的不同页面上重用相同的控件,如下所示:

<uc:MyUserControl ID="MyUserControl" runat="server" Visible="true" 
MyCustomProperty="MyCustomText" />

MyCustomProperty 的目的是将 MyUserControl 中的某些文本控制为我指定的任何内容。

对于第一种情况,我希望文本是“View”,对于第二种情况,我希望它是“MyCustomText”。

在我的用户控件中,我有以下代码来定义属性:

[DefaultValue("View")]
public string MyCustomProperty { get; set; }

我还有以下代码来根据属性更新文本:

LinkButton buttonSelect = e.Item.FindControl("ButtonSelect") as LinkButton;
if(buttonSelect != null) buttonSelect.Text = MyCustomProperty;

实际发生的情况是,如果在第一种情况下未提供自定义属性,则 MyCustomProperty == null。

我试图通过添加 DefaultValue 属性来指定默认值应该是“视图”,但它没有达到我想要的效果。

谁能发现我做错了什么?

4

3 回答 3

5

DefaultValueAttribute视觉设计师和代码生成器用来识别默认值,因此他们可以更智能地生成代码。在 Visual Studio 中,当属性返回的值与属性中声明的值不同时,此属性将导致属性以粗体显示。

DefaultValueAttribute实际上并没有为您设置属性的默认值。为此,只需在构造函数中指定一个合适的默认值。在你的情况下:

public partial class MyUserControl
{
    public MyUserControl()
    {
        MyCustomProperty = "View";
    }

    ...
}

另外,请注意,您编码的属性将无法在回发中存活。如果这是往返之间的重要行为,请务必将其添加到视图状态!

于 2009-08-12T06:36:37.460 回答
2

如何显式设置属性值而不是使用 DefaultValue 属性?

private string _MyCustomProperty = "View";
public string MyCustomProperty 
{
  get
  {
    return _MyCustomProperty;
  }
  set
  {
    _MyCustomProperty = value;
  }
}
于 2009-08-12T06:38:26.863 回答
1

如果你看一下 MSDN 中关于 的注释DefaultValue,你就会明白你做错了什么——

ADefaultValueAttribute不会导致成员使用属性值自动初始化。您必须在代码中设置初始值。

于 2009-08-12T06:37:18.677 回答