Search code examples
c#.netasp.net-coreasp.net-core-mvcrazor-pages

Why do PageModel and ControllerBase use the ActionResult that doesn't belong to them?


We know that instead of a PageModel and page handler, MVC uses a concept of controllers and action methods, but look at the source code of PageModel:

public abstract class PageModel : IAsyncPageFilter, IFilterMetadata, IPageFilter  {
   ...
   public virtual RedirectToPageResult RedirectToPage(string pageName, string pageHandler, object routeValues, string fragment);
   public virtual RedirectToActionResult RedirectToAction(string actionName, string controllerName, object routeValues, string fragment) 
   ...
}

and if you look at the ControllerBase class:

public abstract class ControllerBase {
   ...
   public virtual RedirectToActionResult RedirectToAction(string actionName, string controllerName, object routeValues, string fragment);
   public virtual RedirectToPageResult RedirectToPage(string pageName, string pageHandler, object routeValues, string fragment);
   ...
} 

I'm confused, why Razor pages uses the MVC things RedirectToActionResult (controllerName and actionName), and MVC uses Razor Page things "XXXToPageResult" such as RedirectToPageResult(pageName, pageHandler)?


Solution

  • You can mix MVC controllers and views together with razor Pages in the same ASP.NET Core application, so it makes sense that you should be able to redirect to Razor pages from controllers, and to controller actions from Razor pages.