Iteam
GitHub

Smartare hantering av null-värden i webbkontroller

När man bygger en web user control i C# behöver man ofta hantera situationen att en datakälla kan vara null. Det innebär att man måste hantera detta specialfall överallt i kontrollen för att undvika null reference-fel. Exempel (datakällan till kontrollen är objektet User):

<asp:Literal runat=”server” 
    Text=’<%# User == null ? ”” : User[”firstName”]%>’/>
<asp:Literal runat=”server”
    Text=’<%# User == null ? ”” : User[”lastName”]%>’/>
<asp:Literal runat=”server”
    Text=’<%# User == null ? ”” : User[”email”]%>’/>

Detta skapar dålig och oläslig kod som lätt riskerar att gå sönder i oväntade fall. Vårt tips är därför att overrida metoden DataBindChildren och helt stänga av hela eller delar av din kod innan systemet automatiskt databinder dem:

protected override void DataBindChildren()
{
    if (User != null)
        base.DataBindChildren();
    else
        this.Visible = false;
}

Vilket leder till att din ASPX kod nu kan se ut som den borde:


<asp:Literal runat=”server” Text=’<%# User[”firstName”]%>’/>
<asp:Literal runat=”server” Text=’<%# User[”lastName”]%>’/>
<asp:Literal runat=”server” Text=’<%# User[”email”]%>’/>


Det går ockå bra att använda detta för att välja att binda olika block i din kod:

protected override void DataBindChildren()
{
    if (DisplayMode == DisplayMode.Tiny)
        TinyPlaceHolder.DataBind();
				
    if (DisplayMode == DisplayMode.Small)
        SmallPlaceHolder.DataBind();
}

Detta gör att du kan ha flera presentationssätt i samma kontroll utan att det ska ta mer prestanda, det enda blocket som binds är ju det som är aktuellt, resterande block göms undan. Det normala beteendet är ju att alla block databindningar sker (även i kontroller som är osynliga) vilket tar kraft och gör att du måste hantera alla specialfall direkt i din ASPX kod.

Christian Landgren
2007-12-17