为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
撒科打诨 2022-10-15 14:08:48
我有一个继承自 PageModel 的基类(称为 BmsPageModel)。BmsPageModel 中有一个方法,我需要在每个页面上调用它,以便可以根据权限正确填充菜单。如何使从我的基类继承的每个页面在每个 OnGet 处理程序期间/之后调用此方法,而无需在每个页面中手动键入它?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

当我从一个问题中学到新东西时,我喜欢它。感谢@MikeBrind 的评论和以下链接(学习页面过滤器和页面过滤器上的 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

    }

}


查看完整回答
反对 回复 2022-10-15
?
慕村9548890

TA贡献1884条经验 获得超4个赞

对于.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);

}


查看完整回答
反对 回复 2022-10-15
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信