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

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

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

【问题讨论】:

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

标签: c# asp.net-core razor-pages


【解决方案1】:

我喜欢从一个问题中学到新东西。感谢@MikeBrind 的评论和以下链接(Learn Page FiltersPage 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);
}

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2021-07-27
    • 2020-10-01
    • 2018-11-21
    • 1970-01-01
    • 2020-10-18
    • 2021-02-18
    • 2020-05-26
    相关资源
    最近更新 更多