From c03cd7c26e89ab3307902d19fa97d529fa17a8c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Oct 2025 19:59:09 +0000 Subject: [PATCH 1/3] Initial plan From 70b9a1fae9fc987066feeb20a84cc2e87c865c3b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:16:35 +0000 Subject: [PATCH 2/3] Fix: Prevent overridden PageModel lifecycle methods from being discovered as handlers Co-authored-by: MackinnonBuck <10456961+MackinnonBuck@users.noreply.github.com> --- ...efaultPageApplicationModelPartsProvider.cs | 4 +- ...DefaultPageApplicationModelProviderTest.cs | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs index 5de6835aefa6..9b7ccb1284ec 100644 --- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs +++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs @@ -199,8 +199,8 @@ public bool IsHandler(MethodInfo methodInfo) return false; } - // Exclude methods declared on PageModel - if (declaringType == typeof(PageModel)) + // Exclude methods declared on PageModel (including overrides) + if (methodInfo.GetBaseDefinition().DeclaringType == typeof(PageModel)) { return false; } diff --git a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs index 7d304f7c0a05..8a7221100e9f 100644 --- a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs +++ b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs @@ -1214,6 +1214,53 @@ public void PopulateFilters_AddsPageHandlerPageFilter_ForModelDerivingFromTypeIm [ServiceFilter(typeof(IServiceProvider))] private class DerivedFromPageModel : PageModel { } + [Fact] + public void PopulateHandlerMethods_Ignores_OverriddenPageModelLifecycleMethods() + { + // Arrange + var provider = CreateProvider(); + var typeInfo = typeof(ModelOverridingPageModelLifecycle).GetTypeInfo(); + var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]); + + // Act + provider.PopulateHandlerMethods(pageModel); + + // Assert + // Only OnGet should be discovered as a handler. OnPageHandlerExecuting, OnPageHandlerExecuted, + // and OnPageHandlerSelected are lifecycle methods and should be excluded even when overridden. + var handlerMethods = pageModel.HandlerMethods; + Assert.Collection( + handlerMethods, + handler => + { + Assert.Equal(nameof(ModelOverridingPageModelLifecycle.OnGet), handler.MethodInfo.Name); + Assert.Equal("Get", handler.HttpMethod); + Assert.Null(handler.HandlerName); + }); + } + + private class ModelOverridingPageModelLifecycle : PageModel + { + public void OnGet() + { + } + + public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) + { + base.OnPageHandlerExecuting(context); + } + + public override void OnPageHandlerExecuted(PageHandlerExecutedContext context) + { + base.OnPageHandlerExecuted(context); + } + + public override void OnPageHandlerSelected(PageHandlerSelectedContext context) + { + base.OnPageHandlerSelected(context); + } + } + private static DefaultPageApplicationModelProvider CreateProvider() { var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); From 17481917b48993cac9dd646d3f444462af128e48 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Wed, 22 Oct 2025 09:59:52 -0700 Subject: [PATCH 3/3] Update src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs --- .../DefaultPageApplicationModelProviderTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs index 8a7221100e9f..e485da7156c6 100644 --- a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs +++ b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs @@ -1220,7 +1220,7 @@ public void PopulateHandlerMethods_Ignores_OverriddenPageModelLifecycleMethods() // Arrange var provider = CreateProvider(); var typeInfo = typeof(ModelOverridingPageModelLifecycle).GetTypeInfo(); - var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]); + var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, []); // Act provider.PopulateHandlerMethods(pageModel);