C# 如何将枚举值设置为web用户控件的自定义属性?

C# 如何将枚举值设置为web用户控件的自定义属性?,c#,asp.net,webforms,C#,Asp.net,Webforms,如何将枚举值绑定到web用户控件的属性?我一直收到这个错误 无法从“MyProperty”属性的字符串表示形式“MyEnum.MyValue”创建类型为“MyEnum”的对象 这是MyWebUserControl.ascx.cs背后的代码 [System.ComponentModel.Bindable(true)] public MyEnum MyProperty { get; set; } public MyEnum MyProperty { get; set; } SomeWebUser

如何将枚举值绑定到web用户控件的属性?我一直收到这个错误

无法从“MyProperty”属性的字符串表示形式“MyEnum.MyValue”创建类型为“MyEnum”的对象

这是MyWebUserControl.ascx.cs背后的代码

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
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" />
<uc1:MyWebUserControl runat="server" ID="MyControl" 
    MyProperty="<%# MyEnum.MyValue %>" />

此解决方法可能有助于解决此问题。您可以将“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

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
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" />
<uc1:MyWebUserControl runat="server" ID="MyControl" 
    MyProperty="<%# MyEnum.MyValue %>" />

另请参见:

定义控件上的属性很容易,正如您所做的:

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }
但是,值得注意的是,不需要
[Bindable(true)]
属性。它只是提示VS在属性网格中提供额外的数据绑定属性。它根本不会影响ASP.NET运行时

要在ASPX标记中静态设置此属性,只需使用枚举的值:

最后,要将其作为数据绑定的一部分进行动态设置,可以使用
数据绑定语法:

<uc1:MyWebUserControl runat="server"
    ID="MyControl1"
    MyProperty="<%# GetEnumValueFromSomewhere() %>" />


请注意,只有在进行数据绑定时才应使用数据绑定选项。如果您不想进行数据绑定,那么在整个页面上调用
DataBind()
,甚至在一个控件上调用
DataBind()是相当浪费的。

我认为这并不能解决问题。这个场景涉及到数据绑定,这个答案并没有解决这个问题。@Eilon我想你是对的。我很可能会删除这个答案,因为肖恩似乎找到了正确的答案。没有理由用一个可能有效也可能无效的解决方案来扰乱线程。投票结果是我,我正忙着键入答案。这里的问题是,对整个页面进行数据绑定并不是理想的解决方案。这当然是可能的,而且会奏效,但还有很多其他选择。由于该值是静态的,所以根本不需要数据绑定。实际上,我之前也编辑了您问题的标题,尽管再次查看该问题,我认为我的编辑可能还为时过早。您真的在尝试数据绑定,还是只想将属性设置为静态值?很抱歉我的困惑。@Eilon我只想将属性设置为枚举的值。我的例子比我用来表示我想要达到的目标的词更准确。此外,我宁愿使用枚举而不是字符串,以防我们重构枚举。根本没有使用字符串。问题示例中的错误是无法使用枚举的类型名。只要设置
MyProperty=“TheEnumValue”
,ASP.NET就会做正确的事情。如果我们只使用
MyValue
字符串而不使用
enum
,那么重构时会发生什么?我宁愿将
MyEnum.MyValue
放入属性中,这样,如果我们从
enum
中重构出
MyValue
,编译或类似操作就会中断。它使用的是真实的枚举值,而不是字符串。如果枚举值发生更改,您的代码将无法编译或运行。具体而言,您将收到如下错误:
解析器错误消息:无法从“MyProperty”属性的字符串表示形式“SomeBadValue”创建“MyEnumType”类型的对象。