Asp.net core 捕获Razor页面的所有谓词函数
对于使用ASP.NET Core的Razor页面,有没有任何方法可以为所有谓词创建一个catch-all处理程序,而不是使用单独的OnGet、OnPost。处理程序需要访问构造函数中未提供的HttpContext和请求对象 而不是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() {
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和请求对象。我对这个问题做了一些澄清。然后你必须为所有动词添加方法。所有这些方法都将调用一个方法,该方法将包含您想要执行的公共代码。我添加了一个新的解决方案。