具有默认值的可空属性的自定义控件

时间:2011-02-10 10:36:54

标签: c# .net asp.net user-controls nullable

我可以使用默认值创建自定义控件:

private bool exclue = false;
public bool Exclude { get { return exclue; } set { exclue = value; } }

我可以使用可空属性创建相同的东西:

private EntityStatuses? status = EntityStatuses.Active;
public EntityStatuses? Status { get { return status; } set { status = value; } }

但是,如何在使用自定义控件时将标记中的属性设置为null?

<MyControls:Control ID="Con" runat="server" Status="?" >

3 个答案:

答案 0 :(得分:1)

可以为nullable属性的变通方法(有限制)需要在标记中设置为null。

不幸的是,<%= %>在null值的情况下不起作用,因为服务器控件上属性的字符串值被计算并解析为其所需类型(只有简单值,而不是表达式) 。但这应该适用于数据绑定构造:

<MyControls:Control ID="Con" runat="server" Status="<%#(EntityStatuses?)null %>">

现在,问题是:使用数据绑定表达式需要在控件本身或整个页面上执行DataBind()方法。最简单的方法是确保调用控件的DataBind()方法。

因此,这是一种仅限制的解决方法。

答案 1 :(得分:0)

为什么不将状态设置为null,只在标记中设置时才更改?

private EntityStatuses? status = null;
public EntityStatuses? Status { get { return status; } set { status = value; } }

<MyControls:Control ID="Con" runat="server" >

答案 2 :(得分:0)

使用两种不同类型的属性:

<MyControls:Control runat="server" StatusString="Active" />

public string StatusString // string! because all values in markup are strings
{
    set
    {
        EntityStatuses s;
        if (Enum.TryParse(value, out s))
            this.status = s; // local variable
    }
}

public EntityStatuses Status
{
    get { return this.status; }
}

或使用嵌入式代码块:

<MyControls:Control runat="server" Status='<%= EntityStatuses.Active %>' />