Razor Page的Catch-all动词功能

时间:2018-02-22 15:48:16

标签: asp.net-core razor-pages

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

而不是

select least(col1, col2), greatest(col1, col2), sum(total)
from t
group by least(col1, col2), greatest(col1, col2);

如下所示

case

同样可行的只是在每个请求之前或之后(带上下文)执行的泛型

2 个答案:

答案 0 :(得分:1)

  

同样可行的只是在每个请求之前或之后(带上下文)执行的泛型

考虑到上述情况,您可能想要使用过滤器。声明:

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));
            });

答案 1 :(得分:0)

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

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类,以便它将从您创建的新类继承。在您的课程中,您可以将OnAll方法定义为执行公共代码。

public class TestModel : MyPageModel
{
    public override void OnAll()
    {
        // Write your code here
    }
}