Razor Pages - 在所有 OnGet 处理程序之后从基类调用方法

Posted

技术标签:

【中文标题】Razor Pages - 在所有 OnGet 处理程序之后从基类调用方法【英文标题】:Razor Pages - Call method from base class after all OnGet handlers 【发布时间】:2019-07-28 12:58:08 【问题描述】:

我有一个继承自 PageModel 的基类(称为 BmsPageModel)。我需要在每个页面上调用 BmsPageModel 中的一个方法,以便可以根据权限正确填充菜单。

如何使从我的基类继承的每个页面在每个 OnGet 处理程序期间/之后都调用此方法,而无需在每个页面中手动键入它?

【问题讨论】:

你的意思是打电话给base.OnGet对你不起作用? 我不太确定该怎么做。每当我向基类添加 OnGet 方法时,它都会抱怨有多个匹配的处理程序,如果我必须在每个页面上放置 base.OnGet(),我不妨调用我的其他方法。 最简单的方法是调用基类构造函数中的方法,但缺点是无法访问构造函数中的任何请求数据。 这是一种您可以使用全局过滤器的要求:learnrazorpages.com/razor-pages/filters 【参考方案1】:

我喜欢从一个问题中学到新东西。感谢@MikeBrind 的评论和以下链接(Learn Page Filters 和Page Filters 上的 MS 文档)我可以回答这个问题并更新我的代码。

我还有一个基类,它在 DbContext 上设置了一个全局查询过滤器,因此每个用户的数据都可以相互过滤。我有一个通用方法(称为 PageLoadAsync),我必须记住将其添加到每个页面的 OnGet/OnPost 方法中。现在通过重写执行方法,我可以添加以下内容,而不必在每个子类中添加方法。

public async override Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) 

    await PageLoadAsync();
    await base.OnPageHandlerExecutionAsync(context, next);

如果您想将其限制为仅 OnGet 方法,您可以执行以下操作:

public override void OnPageHandlerExecuting(PageHandlerSelectedContext context)

    if(context.HandlerMethod.MethodInfo.Name == nameof(OnGet))
    
        // code placed here will only execute if the OnGet() method has been selected
    

【讨论】:

很高兴您将此作为答案发布! Mike 的评论也完全符合我的需要。 是否可以在 RazorPage 级别实现相同的目标?我需要为每个剃须刀页面加载一些默认数据,并且只有异步方法可用于获取数据。我在 RazorPage 上看不到任何可覆盖的方法,它允许我为每个 razor 页面调用我的异步代码。我可以使用您答案中的方法实现相同的目标,但是我的所有模型都被无关数据污染了。 我不明白这个问题。覆盖方法是“OnPageHandlerExecutionAsync”。【参考方案2】:

对于 .Net 5 下的剃须刀页面(不是 MVC),这似乎可以正常工作

public async override Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) 
    if (context.HandlerMethod.MethodInfo.Name == "OnGet") 
        // code placed here will only execute if the OnGet() method has been selected
    
    // Triggers the OnGet, OnPost etc on the child / inherited class
    await base.OnPageHandlerExecutionAsync(context, next);

【讨论】:

以上是关于Razor Pages - 在所有 OnGet 处理程序之后从基类调用方法的主要内容,如果未能解决你的问题,请参考以下文章

禁用基于 UserRole Razor Pages 的输入字段

关于后台管理的所有页面都放在Admin文件夹下,在Pages文件夹下新建Admin文件夹

关于 razor,.NET MVC 对 razor 的支持与 .NET razor pages 有啥区别,有啥叫做 .NET MVC razor pages 的东西吗?

循环 GetType().GetProperties() 并将每个属性与 asp-for (Razor Pages) 绑定

Razor 页面中绑定查询参数的规则

无法部署 Razor Pages 网站