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) 绑定