如何将枚举值设置为 Web 用户控件的自定义 属性?
How to set an enum value to a custom property of a web user control?
我们如何将枚举值绑定到 Web 用户控件的 属性?我不断收到此错误。
Cannot create an object of type 'MyEnum' from its string representation 'MyEnum.MyValue' for the 'MyProperty' property.
这是MyWebUserControl.ascx.cs
背后的代码
[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
SomeWebUserControl.ascx
<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl1"
MyProperty="MyEnum.MyValue" />
<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl2"
MyProperty="<%# MyEnum.MyValue %>" />
<!-- This works -->
<uc1:MyWebUserControl runat="server" ID="MyControl3"
MyProperty="0" />
此解决方法可能有助于解决问题。您可以像这样将 "real" 属性 绑定到字符串 属性:
private MyEnum _MyProperty = MyEnum.Default;
[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty
{
get {
return _MyProperty;
}
set {
_MyProperty = value;
}
}
public string MyPropertyString
{
get {
return _MyProperty.ToString();
}
set {
_MyProperty = (MyEnum)Enum.Parse( typeof(MyEnum), value, true );
}
}
并在控件上使用“MyPropertyString”。这不是一个优雅的解决方案,但它可以解决问题。似乎有比这更好的答案,但我环顾四周,还没有找到任何东西。
Page.DataBind()
Page.DataBind()
是必需的 - 这就是所缺少的。
[System.ComponentModel.Bindable(true)]
在 属性 上不是必需的。
例子
MyWebUserControl.ascx.cs
public MyEnum MyProperty { get; set; }
SomeWebUserControl.ascx
<uc1:MyWebUserControl runat="server" ID="MyControl"
MyProperty="<%# MyEnum.MyValue %>" />
SomeWebUserControl.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{
// this is 100% necessary to bind enum
Page.DataBind();
}
另请参阅:Render DateTime.Now directly in the ASPX page
在控件上定义 属性 很容易,就像您所做的那样:
[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
但是,值得注意的是 [Bindable(true)]
属性不是必需的。它只是提示 VS 在 属性 网格中提供额外的数据绑定属性。它根本不影响 ASP.NET 运行时。
要在 ASPX 标记中静态设置此 属性,只需使用枚举的 value:
<uc1:MyWebUserControl runat="server"
ID="MyControl1"
MyProperty="MyValue" />
如果要动态设置,可以在Page_Init
:
void Page_Init() {
MyControl1.MyProperty = GetEnumValueFromSomewhere();
}
<uc1:MyWebUserControl runat="server"
ID="MyControl1" />
最后,要将其动态设置为数据绑定的一部分,您可以使用 <%# foo %>
数据绑定语法:
<uc1:MyWebUserControl runat="server"
ID="MyControl1"
MyProperty="<%# GetEnumValueFromSomewhere() %>" />
请注意,只有在数据绑定 时才应使用数据绑定选项。如果您不尝试进行数据绑定,那么在整个页面上调用 DataBind()
甚至只是在那个控件上调用
是相当浪费的。
我们如何将枚举值绑定到 Web 用户控件的 属性?我不断收到此错误。
Cannot create an object of type 'MyEnum' from its string representation 'MyEnum.MyValue' for the 'MyProperty' property.
这是MyWebUserControl.ascx.cs
背后的代码[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
SomeWebUserControl.ascx
<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl1"
MyProperty="MyEnum.MyValue" />
<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl2"
MyProperty="<%# MyEnum.MyValue %>" />
<!-- This works -->
<uc1:MyWebUserControl runat="server" ID="MyControl3"
MyProperty="0" />
此解决方法可能有助于解决问题。您可以像这样将 "real" 属性 绑定到字符串 属性:
private MyEnum _MyProperty = MyEnum.Default;
[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty
{
get {
return _MyProperty;
}
set {
_MyProperty = value;
}
}
public string MyPropertyString
{
get {
return _MyProperty.ToString();
}
set {
_MyProperty = (MyEnum)Enum.Parse( typeof(MyEnum), value, true );
}
}
并在控件上使用“MyPropertyString”。这不是一个优雅的解决方案,但它可以解决问题。似乎有比这更好的答案,但我环顾四周,还没有找到任何东西。
Page.DataBind()
Page.DataBind()
是必需的 - 这就是所缺少的。[System.ComponentModel.Bindable(true)]
在 属性 上不是必需的。
例子
MyWebUserControl.ascx.cs
public MyEnum MyProperty { get; set; }
SomeWebUserControl.ascx
<uc1:MyWebUserControl runat="server" ID="MyControl"
MyProperty="<%# MyEnum.MyValue %>" />
SomeWebUserControl.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{
// this is 100% necessary to bind enum
Page.DataBind();
}
另请参阅:Render DateTime.Now directly in the ASPX page
在控件上定义 属性 很容易,就像您所做的那样:
[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
但是,值得注意的是 [Bindable(true)]
属性不是必需的。它只是提示 VS 在 属性 网格中提供额外的数据绑定属性。它根本不影响 ASP.NET 运行时。
要在 ASPX 标记中静态设置此 属性,只需使用枚举的 value:
<uc1:MyWebUserControl runat="server"
ID="MyControl1"
MyProperty="MyValue" />
如果要动态设置,可以在Page_Init
:
void Page_Init() {
MyControl1.MyProperty = GetEnumValueFromSomewhere();
}
<uc1:MyWebUserControl runat="server"
ID="MyControl1" />
最后,要将其动态设置为数据绑定的一部分,您可以使用 <%# foo %>
数据绑定语法:
<uc1:MyWebUserControl runat="server"
ID="MyControl1"
MyProperty="<%# GetEnumValueFromSomewhere() %>" />
请注意,只有在数据绑定 时才应使用数据绑定选项。如果您不尝试进行数据绑定,那么在整个页面上调用 DataBind()
甚至只是在那个控件上调用