Lisa Wollin

Creating ASP event handlers

Here's another tip from Rich Klein about how to create event handler for classic ASP code.

If you’ve ever tried to program an event handler for option buttons (also know as radio buttons) in ASP, you know this can be a daunting task. Option buttons do not automatically fire events in a way that can be easily trapped using VBScript. You must specify the event handler for each event when defining the control.

For example, if you want to populate a variable value when a particular option button is clicked, you might try something like this:

<input type="radio" name="rdoButton" OnClick="rdoButton_OnClick('12')">

Because this option button is using a well-defined event tag, including a language attribute is not always necessary, but in other cases, it may be necessary. For example:

input type="radio" name="rdoButton" OnClick="rdoButton_OnClick('12')" language="vbscript">

Using a language attribute ensures the ASP interpreter knows how to handle the event. Without the attribute, the interpreter may try to parse the statement using rules for JavaScript and produce an error when the statement does not conform.

Additionally, option buttons have other quirks. The biggest one I’ve found so far is the fact that if you are creating a dynamic list from a table of data, you would logically place the button in a statement loop. If you define each button with a unique name—for example, the name is terminated by the value of a loop counter—each option button would operate on its own, allowing a user to click more than one button.

If you create each button using the same variable name, then the buttons behave as intended, but now you must access them as an array control, which means that you must use a subscripted reference to the variable name. For example, using the preceding code, "rdoButton(0)" would reference the first option button in the group.

The problem here is that when you are dealing with dynamic data, you won’t always know how many records are returned. This might not be an issue, but in the case in which only one record is returned and there is only one option button, the control cannot be referenced as a control array; it must be referenced as an individual control. Referencing it as an array returns an error because there is no subscript to reference.

To work around this behavior, define the control with a value attribute and a parameter that is passed in the event handler you define.

<input type="radio" name="rdoButton" value="12" OnClick="rdoButton_OnClick('12')" language="vbscript">

Then when creating the event handler in the script, do something like the following:

<script language="vbscript">
   Sub rdoButton_OnClick(varNum)
      If IsNumeric(varNum) then
         form.hCurrentRecord.value = varNum
      Else
         form.hcurrentRecord.value = form.rdoButton.value
      End If
   End Sub
</script>

Note   The 'form' designation is the name given to the form object in which the option buttons are contained.

By using this format, you avoid entirely the necessity of finding the array subscript of the option button and the error produced if trying to reference the non-existent array value of a single button. As a side note, if you place an alert in the first line of the sub that displays the value of the variable passed in 'varNum', you will see that, in the case of a single option button, the event fires twice. The first time it displays the proper value passed, and the second time it displays a reference to the object. This is why getting the value from the control is necessary. This technique could probably be simplified further by just ignoring the second event. Then the Else clause would not be required and the value attribute in the option buttons could be eliminated.

Published Thursday, July 22, 2004 3:46 PM by lisawoll
Anonymous comments are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker