繁体   English   中英

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

[英]How to set an enum value to a custom property of a web user control?

我们如何将枚举值绑定到Web用户控件的属性? 我一直收到此错误。

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

这是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" />

定义控件上的属性很容易,就像您已经做的那样:

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }

但是,值得注意的是,不需要[Bindable(true)]属性。 它只是为了提示VS在属性网格中提供其他数据绑定属性。 它根本不影响ASP.NET运行时。

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

<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() %>" />

请注意, 只有在databinding时才应使用databinding选项。 如果您不尝试进行数据绑定,则在整个页面甚至仅在那个控件上调用DataBind()都是很浪费的。

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

另请参阅: 渲染DateTime.Now直接在ASPX页面中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM