DevTips.NET

Bepaal button van postback in ASP.NET

Soms wil je een bepaalde actie uitvoeren bij een ASP.NET postback die afhankelijk is van de control die zorgde voor de postback. Bijvoorbeeld als je een formulier hebt met allerlei secties en aparte CustomValidators die een postback kunnen doen. Of je wil de focus zetten op de control die de postback heeft veroorzaakt.

Er zijn verschillende manieren om dit op te lossen. De meest getoonde manier maakt gebruik van "__EVENTTARGET". Dit is een verborgen element dat via javascript gevuld wordt met de naam van de control die de postback veroorzaakte. Het probleem hierbij is dat deze optie vaak werkt voor dropdownlists, checkboxes, linkbuttons. Maar het werkt niet voor gewone buttons. Dat komt omdat deze buttons geen javascript uitvoeren maar simpelweg gerendered worden als een input-element van het typesubmit. Een oplossing hiervoor staat onder meer hier.

De code in het codeknipsel is een alternatieve optie. De code maakt gebruik van C# 3.0 features (zoals een lambda-expressie) en de extension method FirstOrDefault() wat onderdeel is van LINQ. Het idee is dat de button die verantwoordelijk was voor de postback in de Request.Forms.Keys-collectie zit. Andere buttons op het formulier staan niet in deze collectie.

C# ASP.NET Web Forms

Code

protected void Page_Load(object sender, EventArgs e)
    {
        if (this.IsPostBack)
        {
            if (Request.Form.Keys.Cast<string>().FirstOrDefault(s => s.Contains("button1")) != null)
                LabelTitel.Text = "Button 1 geklikt.";
            if (Request.Form.Keys.Cast<string>().FirstOrDefault(s => s.Contains("button2")) != null)
                LabelTitel.Text = "Button 2 geklikt.";
        }
    }
comments powered by Disqus