asp.net用户控件默认属性值
我需要一些帮助。我正在构建一个定制的Web用户控件,它将会选择颜色。asp.net用户控件默认属性值
截至目前,它在页面上有两个[asp:textbox] es(foregroundColour和backgroundColour)。
我希望我的前景色默认为“FFFFFF”,我的背景色默认为“000000”,并且用户可以通过标签指定自己的初始值。
<ucFontChooser id="testchooser" runat="server" foregroundcolor="AABBCC" />
我有被捆绑到文本框的两个属性:
[DefaultValue("000000")]
public string ForegroundColor { get { return foregroundColorSelectorHex.Text; } set { foregroundColorSelectorHex.Text = value; } }
[DefaultValue("FFFFFF")]
public string BackgroundColor { get { return backgroundColorSelectorHex.Text; } set { backgroundColorSelectorHex.Text = value; } }
请注意,我知道,将默认值仅适用于Visual Studio的属性窗口中,并不实际设置的任何值。
不过,我已经尝试设置默认值由用户控件的构造函数来做到:
ForegroundColor = "000000"
这给了我一个例外,因为在构造来看,foregroundColorSelectorHex是null。
所以,如果我尝试在的OnInit事件设置默认,或*的Page_Load *那么它只是始终使用我设置的默认和“AABBCC”的设定属性值将被覆盖。
什么是正确的方式做我想要什么?
谢谢。
许多调试后,我想出了一个解决方案,做的正是我需要的。
public override string ID
{
set
{
base.ID = value;
InitializeProperties();
}
}
protected void InitializeProperties()
{
ForegroundColor = "000000";
BackgroundColor = "ffffff";
EnableBackgroundColor = false;
PrimaryFont = "Arial";
SecondaryFont = "Helvetica";
TertiaryFont = "sans-serif";
}
.NET框架将调用mycontrol.ID =“bla”,这是当用户控制子控件进入上下文。它被称为BEFORE包含控件/页面读取标签属性并设置属性。
看起来很不舒服,但效果很好。
我认为一个完整的答案在这里回答太长了,它已经在MSDN上有记录。
看到这个页面:http://msdn.microsoft.com/en-us/library/ms972975.aspx
,搜索文本“添加属性和方法到用户控件”
(但无论如何阅读整篇文章,以便您了解详情。)
但是,从文章中的代码,它应该如何返回默认值,如果该属性为空。假设您有一个名为CategoryID的属性,则应该将该属性定义为:
public int CategoryID
{
get
{
object o = ViewState["CategoryID"];
if (o == null)
return 0; // return a default value
else
return (int) o;
}
set
{
ViewState["CategoryID"] = value;
}
}
您可以使用相同的模式来定义颜色。
不知道这会工作,但你可以做这样的事情在你的Page_Load:
protected void Page_Load {
if (String.IsNullOrEmpty(ForegroundColor))
ForegroundColor = "FFFFFF";
}
你应该初始化值时,它不回传即
if(!Page.IsPostBack){
//Initialize your values
ForegroundColor = "FFFFFF";
}
你能不能在构造函数中创建您的foregroundColorSelectorHex和backgroundColorSelectorHex?
public string ForegroundColor {
get { return foregroundColorSelectorHex.Text; }
set { foregroundColorSelectorHex.Text = value; }
}
public string BackgroundColor {
get { return backgroundColorSelectorHex.Text; }
set { backgroundColorSelectorHex.Text = value; }
}
public FontChooser() {
foregroundColorSelectorHex = new ColorSelector();
backgroundColorSelectorHex = new ColorSelector();
ForegroundColor = "FFFFFF";
BackgroundColor = "000000";
}
我试过了,但asp.net只是在调用构造函数后创建了一个新的ColorSelector(),所以它们都被一个新对象覆盖。 – Matthew 2011-03-25 20:22:17
建议保持财产的价值在ViewState中,然后设置。文本中Page_PreRender,像这样:
public string ForegroundColor
{
get
{
if (ViewState["forecolor"] == null)
{
ViewState["forecolor"] = "000000";
}
return (string) ViewState["forecolor"];
}
set
{
ViewState["forecolor"] = value;
}
}
protected override void OnInit(EventArgs e)
{
this.PreRender += Page_PreRender;
base.OnInit(e);
}
private void Page_PreRender(object sender, EventArgs e)
{
foregroundColorSelectorHex.Text = ForegroundColor;
}
这是在页面生命周期中赋值太晚的值。 – Matthew 2011-03-29 18:40:44