{"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/3600ca084e9c8b5f4174fc5e747f4c52d2100806/src/Components/Components/src/RenderTree/EventArgsTypeCache.cs#L26-L50","documentation":"The second guard in EventArgsTypeCache.GetEventArgsType: when a handler has exactly one parameter, that parameter's type must derive from EventArgs (or be EventArgs itself) so the event-dispatch pipeline can pass the matching event payload. If the single parameter is, for example, int, string, or a custom non-EventArgs type, the cache cannot infer a valid event-args type and throws.","triggerScenarios":"Wiring @onclick=\"HandleClick\" where HandleClick is declared as void HandleClick(int id) or void HandleClick(MyDto data) with MyDto not deriving from EventArgs. The first parameter type fails typeof(EventArgs).IsAssignableFrom(declaredType).","commonSituations":"Using a domain object as the event-handler parameter instead of MouseEventArgs/KeyboardEventArgs/EventArgs. Migrating a callback signature that previously took a plain value. Selecting an overload whose parameter is a non-EventArgs type.","solutions":["Change the handler's parameter to an EventArgs-derived type matching the event (e.g., MouseEventArgs for @onclick, KeyboardEventArgs for @onkeydown, or plain EventArgs).","If the handler needs additional data, capture it via closure and keep only the EventArgs parameter.","For parameterless handling, remove the parameter entirely so the cache treats it as EventArgs."],"exampleFix":"// before\nvoid HandleClick(int id) { ... }\n<button @onclick=\"HandleClick\">...</button>\n\n// after\nvoid HandleClick(MouseEventArgs e) { ... /* use captured id */ }\n<button @onclick=\"HandleClick\">...</button>","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"static bool IsEventHandlerParamValid(MethodInfo m)\n{\n    var ps = m.GetParameters();\n    return ps.Length == 0\n        || (ps.Length == 1 && typeof(EventArgs).IsAssignableFrom(ps[0].ParameterType));\n}\n\nAssert.True(IsEventHandlerParamValid(typeof(MyComponent).GetMethod(nameof(MyComponent.HandleClick))!));","tryCatchPattern":null,"preventionTips":["Use EventArgs-derived types (MouseEventArgs, KeyboardEventArgs, etc.) for handler parameters.","Capture non-event data in closure variables rather than as handler parameters.","Validate handler signatures in unit tests for component libraries."],"tags":["blazor","events","event-handler","reflection"],"backgroundTag":null,"analyzedSha":"3600ca084e9c8b5f4174fc5e747f4c52d2100806","analyzedAt":"2026-08-11T16:32:30.678Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}