ASP.NET – Cross browser default button
Posted by Andreas
We have previously covered default buttons both in Silverlight and generic ASP.NET (both in Norwegian, but the code samples know no language barriers). I thought I’d add a third post about this, because the generic ASP.NET default button only shows the simplest approach – which is not fully browser independent. It works great in Internet Explorer, but if you want to make sure it also works in other browsers like Chrome and Firefox a more thorough approach is required.
I solved this by creating a new class that inherits from System.Web.UI.WebControls.LinkButton. In the OnLoad event, a script is added to the page which handles the click event for the link button. I would add a reference to the source of the script if I had it, but unfortunately that’s long gone.
Create a new class called LinkButtonDefault.cs and add the following code:
using System; using System.Web.UI.WebControls; namespace My.Very.Own.Namespace { public class LinkButtonDefault : LinkButton { protected override void OnLoad(System.EventArgs e) { Page.ClientScript.RegisterStartupScript(GetType(), "addClickFunctionScript", _addClickFunctionScript, true); string script = String.Format(_addClickScript, ClientID); Page.ClientScript.RegisterStartupScript(GetType(), "click_" + ClientID, script, true); base.OnLoad(e); } private const string _addClickScript = "addClickFunction('{0}');"; private const string _addClickFunctionScript = @" function addClickFunction(id) {{ var b = document.getElementById(id); if (b && typeof(b.click) == 'undefined') b.click = function() {{ var result = true; if (b.onclick) result = b.onclick(); if (typeof(result) == 'undefined' || result) {{ eval(b.getAttribute('href')); }} }}}};"; } }
At the top of the page where you want your custom default link button, register the component and give it a tag prefix:
<%@ Register TagPrefix="UR" Namespace="My.Very.Own.Namespace" Assembly="Name.Of.Your.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3011884815bf2cfd" %>
Replace namespace, assembly name and public key token with your corresponding values. Then create a button based on your inherited class (using the tag prefix defined in the previous step):
<UR:LinkButtonDefault ID="lnkContinue" runat="server" onclick="btnContinue_Click">
Wrap the button inside a panel, and set the DefaultButton parameter to your button:
<asp:Panel ID="Panel1" runat="server" DefaultButton="lnkContinue">
Silverlight 4 Default button
Posted by Andreas

Silverlight har ikke den innebygde Default button propertien som støttes i for eksempel Panels i ASP.NET. For de utviklerne som lever et liv i skyggen sørger denne for at du kan peke på en control innenfor et panel hvor Click event skal kalles når brukeren trykker Enter. Et typisk eksempel er en login-side hvor Enter simulerer trykk på Log in-knappen.
Silverlight / XAML har ikke denne muligheten - merkelig nok. Det er derfor en del fremgangsmåter rundt på nettet, men denne her er grei og fungerer i Silverlight 4.
Denne koden er frekt og freidig (og sikkert uten samtykke) lånt av Patrick Cauldwell - men siden jeg gir ham cred så er det sikkert greit.
1. Opprett en klasse i prosjektet, kall denne DefaultButtonService
2. Kopier inn dette (oppdater namespace til ditt eget):
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;
namespace SilverlightDemo
{
public static class DefaultButtonService
{
public static readonly DependencyProperty DefaultButtonProperty =
DependencyProperty.RegisterAttached("DefaultButton", typeof(string), typeof(DefaultButtonService), new PropertyMetadata(OnDefaultButtonChanged));
public static string GetDefaultButton(DependencyObject d)
{
return (string)d.GetValue(DefaultButtonProperty);
}
///
/// Sets the CommandParameter property.
///
public static void SetDefaultButton(DependencyObject d, string value)
{
d.SetValue(DefaultButtonProperty, value);
}
private static void OnDefaultButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBox tb = d as TextBox;
if (tb != null)
{
tb.KeyUp += new KeyEventHandler(tb_KeyUp);
}
}
static void tb_KeyUp(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Enter:
string name = (string)((DependencyObject)sender).GetValue(DefaultButtonProperty);
object root = App.Current.RootVisual;
object button = ((FrameworkElement)root).FindName(name);
if (button is Button)
{
ButtonAutomationPeer peer = new ButtonAutomationPeer((Button)button);
IInvokeProvider ip = (IInvokeProvider)peer;
ip.Invoke();
}
break;
}
}
}
}
3. Legg til et xmlns i XAML:
xmlns:my="clr-namespace:SilverlightDemo"
4. Legg til en attributt på alle controls som skal trigge at knappen "btnDemo" skal trykkes, for eksempel en textbox:
DefaultButton i ASP.NET
Posted by Stian
Forskjellige nettlesere behandler et enter-trykk på forskjellige måter avhengig av antall tekstbokser og antall knapper på siden. Dette gjør at vi må styre hvilke knapp som skal behandle et enter-trykk i web applikasjonen. Løsninger som å disable enter knappen med et javascript kan få uheldige konsekvenser som f.eks i en Text Area komponent hvor linjeskift ikke vil virke lenger.
Løsning du vil bruke i de fleste tilfellene er:
<form id="form1" runat="server" defaultbutton="btn1">
Problemet med denne løsningen kom jeg akkurat over i et prosjekt hvor det som så mange andre plasser brukes Masterpages. Vi står derfor uten en form-tag i undersiden og vi må i stedet bruke Panel på denne måten:
<asp:Panel ID="pnl1" runat="server" defaultbutton="Button1">
På denne måten kan du styre flere områder på websiden til å trigge forskjellige Buttons ved enter-trykk.

Degree Consulting Group is a Norwegian IT consulting company with professional and enthusiastic programmers in .NET, SharePoint, Windows Phone, Java og Flex.
Degree is also offering full administration of IT systems for small and medium businesses at very competitive prices.
For more information about us, take a look at our corporate webpage (in Norwegian) www.degree.no
Degree Blog
Recent posts
- Sharepoint debugging – process terminated by IIS
- Executing commands and programs on a remote machine – Part 2
- IsNullOrEmpty() extension for generic lists (List<T>)
- Downloading blobs from Windows Azure
- Presenting the Degree Blog Team
Links
Tags
Recent Comments
- thorhalvor on Powershell returns exitcode 0 instead of 1
- Krupesh on Sharepoint 2010 – Adding TaxonomyFieldControl to custom Page Layout
- Krupesh on Sharepoint 2010 – Adding TaxonomyFieldControl to custom Page Layout
- Krupesh on Sharepoint 2010 – Adding TaxonomyFieldControl to custom Page Layout
- Muchacho Espiador on jQuery validation not working in IE7 and IE8