Asp.net core 捕获Razor页面的所有谓词函数

Asp.net core 捕获Razor页面的所有谓词函数,asp.net-core,razor-pages,Asp.net Core,Razor Pages,对于使用ASP.NET Core的Razor页面,有没有任何方法可以为所有谓词创建一个catch-all处理程序,而不是使用单独的OnGet、OnPost。处理程序需要访问构造函数中未提供的HttpContext和请求对象 而不是 public class ExampleModel : PageModel { public void OnGet() { //do something } public void OnPost() {

对于使用ASP.NET Core的Razor页面,有没有任何方法可以为所有谓词创建一个catch-all处理程序,而不是使用单独的OnGet、OnPost。处理程序需要访问构造函数中未提供的HttpContext和请求对象

而不是

public class ExampleModel : PageModel
{
    public void OnGet()
    {
        //do something
    }

    public void OnPost()
    {
        //do something
    }        
}
类似于下面的内容

public class ExampleModel : PageModel
{
    public void OnAll()
    {
        //code executes for POST, PUT, GET, ... VERBS
    }
}

同样有效的是在每个请求的上下文之前或之后执行的通用命令

如果要对所有请求方法执行一组命令,可以使用PageModel的constractor:

public class IndexModel : PageModel
{
    public IndexModel()
    {
        // This will be executed first
    }

    public void OnGet()
    {

    }
}
新解决方案

我还有一个解决办法。创建一个从PageModel继承的类,在该类中捕获所有不同的请求方法并调用新的虚拟方法

public class MyPageModel : PageModel
{
    public virtual void OnAll()
    {

    }

    public void OnGet()
    {
        OnAll();
    }
    public void OnPost()
    {
        OnAll();
    }
}
现在更改PageModel类,使其从您创建的新类继承。在您的类中,您可以覆盖onal方法以执行您的公共代码

public class TestModel : MyPageModel
{
    public override void OnAll()
    {
        // Write your code here
    }
}
同样有效的是在每个请求的上下文之前或之后执行的一般性操作

考虑到上述因素,您可能希望使用过滤器。声明:

public class DefaultFilterAttribute : ResultFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext context)
    {
        Console.WriteLine("Here we go");

        base.OnResultExecuted(context);
    }
}
如果您只想在单个页面上看到此行为:

[DefaultFilter]
public class IndexModel : PageModel
{
}
如果需要在所有页面Startup.cs上应用此筛选器:

 services.AddMvcOptions(options =>
            {
                options.Filters.Add(typeof(DefaultFilterAttribute));
            });

处理程序需要访问构造函数中不可用的HttpContext和请求对象。我对这个问题做了一些澄清。然后你必须为所有动词添加方法。所有这些方法都将调用一个方法,该方法将包含您想要执行的公共代码。我添加了一个新的解决方案。