{"record":{"id":"1fae009e01f1e27c","repo":"dotnet/aspnetcore","slug":"the-event-handler-parameter-type-declaredtype-ful","errorCode":null,"errorMessage":"The event handler parameter type {declaredType.FullName} for event must inherit from {typeof(EventArgs).FullName}.","messagePattern":"The event handler parameter type (.+?) for event must inherit from (.+?)\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Components/Components/src/RenderTree/EventArgsTypeCache.cs","lineNumber":44,"sourceCode":"            var parameterInfos = methodInfo.GetParameters();\n            if (parameterInfos.Length == 0)\n            {\n                return typeof(EventArgs);\n            }\n            else if (parameterInfos.Length > 1)\n            {\n                throw new InvalidOperationException($\"The method {methodInfo} cannot be used as an event handler because it declares more than one parameter.\");\n            }\n            else\n            {\n                var declaredType = parameterInfos[0].ParameterType;\n                if (typeof(EventArgs).IsAssignableFrom(declaredType))\n                {\n                    return declaredType;\n                }\n                else\n                {\n                    throw new InvalidOperationException($\"The event handler parameter type {declaredType.FullName} for event must inherit from {typeof(EventArgs).FullName}.\");\n                }\n            }\n        });\n    }\n}\n","sourceCodeStart":26,"sourceCodeEnd":50,"githubUrl":"https://github.com/dotnet/aspnetcore/blob/294cab2f9b2e03af6b953820c7ab497c3c8b7ad9/src/Components/Components/src/RenderTree/EventArgsTypeCache.cs#L26-L50","documentation":"Blazor event handlers that accept a single parameter require that parameter to be assignable to System.EventArgs (or one of its subclasses like MouseEventArgs, KeyboardEventArgs, ChangeEventArgs). When EventArgsTypeCache.GetEventArgsType encounters a single-parameter method whose parameter type does not inherit from EventArgs, it throws InvalidOperationException. This ensures type safety for DOM event dispatch.","triggerScenarios":"Using a method as a Blazor event handler (@onclick=\"MyMethod\") where MyMethod accepts a single parameter whose type is not an EventArgs subclass, e.g., void MyMethod(int id) or void MyMethod(MyCustomDto data). The framework resolves the type via reflection and rejects non-EventArgs types.","commonSituations":"Confusion about Blazor event handler signatures; trying to pass custom data objects as the event argument; migrating from a different framework where arbitrary types were allowed; using a method that takes a primitive type (int, string) as the event handler.","solutions":["Use the correct EventArgs subclass for the event type: MouseEventArgs for @onclick/@onmouseover, KeyboardEventArgs for @onkeydown/@onkeyup, ChangeEventArgs for @onchange/@oninput.","If you need to pass custom data, use a lambda closure instead: @onclick=\"@(() => Handler(myData))\".","If no event argument is needed, declare the handler with zero parameters.","Check the Blazor docs for the correct EventArgs subclass mapping for each DOM event."],"exampleFix":"<!-- before -->\n@onclick=\"HandleClick\"\n@code {\n    void HandleClick(int id) { } // int is not EventArgs\n}\n\n<!-- after -->\n@onclick=\"@(e => HandleClick(itemId))\"\n@code {\n    void HandleClick(int id) { }\n}","handlingStrategy":"validation","validationCode":"// Validate that a handler's single parameter inherits from EventArgs\nstatic bool HasValidEventArgsParameter(MethodInfo method)\n{\n    var parms = method.GetParameters();\n    if (parms.Length != 1) return parms.Length == 0;\n    return typeof(EventArgs).IsAssignableFrom(parms[0].ParameterType);\n}","typeGuard":"// In Razor, use the correct EventArgs subclass implicitly:\n// @onclick=\"Handler\" where void Handler(MouseEventArgs e) { }","tryCatchPattern":null,"preventionTips":["Use the correct EventArgs subclass for each DOM event (MouseEventArgs for click, KeyboardEventArgs for key events, etc.).","For custom data, use lambda closures instead of changing the parameter type.","Keep a reference of Blazor event-to-EventArgs mappings handy.","Run a Roslyn analyzer to validate handler parameter types at build time."],"tags":["blazor","event-handler","eventargs","type-safety","razor"],"analyzedSha":"294cab2f9b2e03af6b953820c7ab497c3c8b7ad9","analyzedAt":"2026-08-06T20:08:02.189Z","schemaVersion":2},"datasetVersion":"2026-08-06T23:17:07.152Z"}