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

3
我可以创建一个带有默认值的自定义控件:
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个回答

1

对于需要在标记中设置为null的可空属性,有一个(带限制的)解决方法。

不幸的是,在空值的情况下<%= %>无法工作,因为服务器控件上属性的字符串值会被评估和解析为其所需的类型(仅简单值,而不是表达式)。但这应该可以使用数据绑定构造来解决:

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

现在,问题是:使用数据绑定表达式需要在控件本身或整个页面上执行 DataBind() 方法。最简单的方法是确保调用控件的 DataBind() 方法。
因此,这只是一种有限制的解决方法。

所以我理解没有一种“正确”的方法来做这个吗? - Daniel

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 %>' />

要么我不理解你写的内容,要么你没有理解我的意思。 上面的代码中是什么使默认值与null不同? 我想要一个默认值,它不是null,并且可以在标记中设置将该值设置为null的能力。谢谢回复。 - Daniel
@user239427:默认值应该在类内部设置。属性值可以在类外部设置,例如从标记中设置。因此,这只是设置属性值,而不是默认属性值。请参见我的更新帖子。 - abatishchev

0
为什么不将状态设置为 null,只在标记中设置时更改它呢?
private EntityStatuses? status = null;
public EntityStatuses? Status { get { return status; } set { status = value; } }

并且

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

我想要一个默认值,它不是 null。通常我需要某种配置。我只想在需要设置为 null 的情况下能够将其设置为 null。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接