Skip to content

Event Handling in Blazor

Common Events

Blazor uses the @ prefix to handle browser events, such as button clicks and text changes.

razor
<button @onclick="HandleClick">Click me</button>
<input @onchange="HandleChange" />
<div @onmouseover="HandleMouseOver">Hover me</div>

@code {
    private void HandleClick()
    {
        Console.WriteLine("Button clicked!");
    }

    private void HandleChange(ChangeEventArgs e)
    {
        var newValue = e.Value?.ToString();
        Console.WriteLine($"Value changed to: {newValue}");
    }

    private void HandleMouseOver()
    {
        Console.WriteLine("Mouse over event!");
    }
}

Event Arguments

Events can receive event arguments for additional information:

razor
<button @onclick="@((e) => HandleClickWithArgs(e))">Click with args</button>

@code {
    private void HandleClickWithArgs(MouseEventArgs e)
    {
        Console.WriteLine($"Mouse position: {e.ClientX}, {e.ClientY}");
    }
}

EventCallback

Blazor allows event communication between parent and child components using EventCallback. This enables components to notify their parents about events.

Child Component

razor
<button @onclick="OnClick">Click me</button>

@code {
    [Parameter]
    public EventCallback OnClick { get; set; }
}

Parent Component

razor
<ChildComponent OnClick="HandleChildClick" />

@code {
    private void HandleChildClick()
    {
        Console.WriteLine("The child component's button was clicked");
    }
}

EventCallback with Parameters

You can pass data from child to parent using EventCallback<T>:

razor
// Child Component
<button @onclick="@(() => OnValueChange.InvokeAsync(42))">Send Value</button>

@code {
    [Parameter]
    public EventCallback<int> OnValueChange { get; set; }
}

// Parent Component
<ChildComponent OnValueChange="@HandleValueChange" />

@code {
    private void HandleValueChange(int value)
    {
        Console.WriteLine($"Received value: {value}");
    }
}

Preventing Default Actions

Use @onclick:preventDefault to prevent default browser behavior:

razor
<a @onclick="HandleClick" @onclick:preventDefault href="#">
    Click me without navigation
</a>

Stop Event Propagation

Use @onclick:stopPropagation to prevent event bubbling:

razor
<div @onclick="HandleDivClick">
    <button @onclick="HandleButtonClick" @onclick:stopPropagation>
        Click me
    </button>
</div>