The ToggleButtonExtender replaces a target checkbox with a clickable image that toggles between checked and unchecked states. It supports separate images for checked, unchecked, hover, and disabled states, providing a visually rich alternative to standard checkboxes.
Original Ajax Control Toolkit documentation: https://www.asp.net/ajax/ajaxcontroltoolkit/ToggleButtonExtender
TargetControlID— ID of the checkbox to enhance with toggle image behaviorImageWidth— Width of the toggle image in pixelsImageHeight— Height of the toggle image in pixelsUncheckedImageUrl— Image URL for the unchecked stateCheckedImageUrl— Image URL for the checked stateUncheckedImageAlternateText— Alt text for the unchecked imageCheckedImageAlternateText— Alt text for the checked imageCheckedImageOverUrl— Hover image URL when checkedUncheckedImageOverUrl— Hover image URL when uncheckedDisabledUncheckedImageUrl— Image URL when disabled and uncheckedDisabledCheckedImageUrl— Image URL when disabled and checkedEnabled— Enable or disable the extender behaviorBehaviorID— Optional identifier for JavaScript behavior lookup
<asp:CheckBox ID="chkSubscribe" runat="server" />
<ajaxToolkit:ToggleButtonExtender
ID="tbe1"
runat="server"
TargetControlID="chkSubscribe"
ImageWidth="24"
ImageHeight="24"
UncheckedImageUrl="~/images/toggle-off.png"
CheckedImageUrl="~/images/toggle-on.png"
UncheckedImageAlternateText="Not subscribed"
CheckedImageAlternateText="Subscribed"
CheckedImageOverUrl="~/images/toggle-on-hover.png"
UncheckedImageOverUrl="~/images/toggle-off-hover.png" /><CheckBox ID="chkSubscribe" />
<ToggleButtonExtender
TargetControlID="chkSubscribe"
ImageWidth="24"
ImageHeight="24"
UncheckedImageUrl="/images/toggle-off.png"
CheckedImageUrl="/images/toggle-on.png"
UncheckedImageAlternateText="Not subscribed"
CheckedImageAlternateText="Subscribed"
CheckedImageOverUrl="/images/toggle-on-hover.png"
UncheckedImageOverUrl="/images/toggle-off-hover.png" />Migration is simple: Remove the ajaxToolkit: prefix and runat="server". Update image paths from ~/ to /. Everything else stays the same!
| Property | Type | Default | Description |
|---|---|---|---|
TargetControlID |
string |
(required) | ID of the checkbox to enhance with toggle image behavior |
ImageWidth |
int |
0 |
Width of the toggle image in pixels |
ImageHeight |
int |
0 |
Height of the toggle image in pixels |
UncheckedImageUrl |
string |
"" |
URL of the image displayed when the checkbox is unchecked |
CheckedImageUrl |
string |
"" |
URL of the image displayed when the checkbox is checked |
UncheckedImageAlternateText |
string |
"" |
Alternate text for the unchecked image (accessibility) |
CheckedImageAlternateText |
string |
"" |
Alternate text for the checked image (accessibility) |
CheckedImageOverUrl |
string |
"" |
URL of the image displayed on hover when checked |
UncheckedImageOverUrl |
string |
"" |
URL of the image displayed on hover when unchecked |
DisabledUncheckedImageUrl |
string |
"" |
URL of the image displayed when disabled and unchecked |
DisabledCheckedImageUrl |
string |
"" |
URL of the image displayed when disabled and checked |
BehaviorID |
string |
TargetControlID | Optional identifier for JavaScript behavior lookup |
Enabled |
bool |
true |
Whether the extender is active |
@rendermode InteractiveServer
<CheckBox ID="chkNotifications" />
<ToggleButtonExtender
TargetControlID="chkNotifications"
ImageWidth="48"
ImageHeight="24"
UncheckedImageUrl="/images/switch-off.png"
CheckedImageUrl="/images/switch-on.png"
UncheckedImageAlternateText="Notifications off"
CheckedImageAlternateText="Notifications on" />@rendermode InteractiveServer
<CheckBox ID="chkFavorite" />
<ToggleButtonExtender
TargetControlID="chkFavorite"
ImageWidth="32"
ImageHeight="32"
UncheckedImageUrl="/images/star-empty.png"
CheckedImageUrl="/images/star-filled.png"
UncheckedImageOverUrl="/images/star-empty-hover.png"
CheckedImageOverUrl="/images/star-filled-hover.png"
UncheckedImageAlternateText="Add to favorites"
CheckedImageAlternateText="Remove from favorites" />@rendermode InteractiveServer
<CheckBox ID="chkFeature" Enabled="false" />
<ToggleButtonExtender
TargetControlID="chkFeature"
ImageWidth="48"
ImageHeight="24"
UncheckedImageUrl="/images/toggle-off.png"
CheckedImageUrl="/images/toggle-on.png"
DisabledUncheckedImageUrl="/images/toggle-off-disabled.png"
DisabledCheckedImageUrl="/images/toggle-on-disabled.png" />The ToggleButtonExtender produces no HTML itself — it attaches JavaScript behavior that replaces the checkbox's visual appearance with an image element while preserving the checkbox's checked/unchecked state.
The ToggleButtonExtender loads toggle-button-extender.js as an ES module. JavaScript handles:
- Hiding the original checkbox and displaying an image in its place
- Swapping images on click (checked ↔ unchecked)
- Swapping images on hover (over states)
- Displaying disabled images when the checkbox is disabled
- Keeping the underlying checkbox state in sync
The ToggleButtonExtender requires InteractiveServer render mode:
@rendermode InteractiveServer- SSR/Static mode: The extender silently skips initialization. The standard checkbox is displayed.
- JavaScript disabled: Same as SSR — standard checkbox functions normally.
-
Remove
ajaxToolkit:prefix- <ajaxToolkit:ToggleButtonExtender + <ToggleButtonExtender
-
Remove
runat="server"andIDattributes -
Update image paths from
~/syntax to/paths- UncheckedImageUrl="~/images/toggle-off.png" + UncheckedImageUrl="/images/toggle-off.png"
<asp:CheckBox ID="chkAgree" runat="server" />
<ajaxToolkit:ToggleButtonExtender
ID="tbe1"
TargetControlID="chkAgree"
ImageWidth="24"
ImageHeight="24"
UncheckedImageUrl="~/images/unchecked.png"
CheckedImageUrl="~/images/checked.png"
runat="server" /><CheckBox ID="chkAgree" />
<ToggleButtonExtender
TargetControlID="chkAgree"
ImageWidth="24"
ImageHeight="24"
UncheckedImageUrl="/images/unchecked.png"
CheckedImageUrl="/images/checked.png" />- Always provide alt text — Set
UncheckedImageAlternateTextandCheckedImageAlternateTextfor accessibility - Use consistent image sizes — Set
ImageWidthandImageHeightto prevent layout shifts - Provide hover states —
CheckedImageOverUrlandUncheckedImageOverUrlimprove visual feedback - Include disabled states — If your checkbox can be disabled, provide
DisabledCheckedImageUrlandDisabledUncheckedImageUrl - Optimize images — Use small, optimized PNG or SVG images for fast loading
| Issue | Solution |
|---|---|
| Image not appearing | Verify CheckedImageUrl and UncheckedImageUrl point to valid image files. Ensure @rendermode InteractiveServer is set. |
| Standard checkbox still visible | Check that TargetControlID matches the checkbox's ID exactly. |
| Hover state not working | Verify CheckedImageOverUrl and UncheckedImageOverUrl paths are correct. |
| Toggle state not syncing | Ensure the target is a checkbox element. Check browser console for JavaScript errors. |
- Ajax Control Toolkit Overview — How extenders work and render mode requirements
- ConfirmButtonExtender — Button confirmation dialogs
- CheckBox Component — The CheckBox control
- Original Ajax Control Toolkit: https://www.asp.net/ajax/ajaxcontroltoolkit