【问题标题】:Catch-all verbs function for Razor PageRazor 页面的包罗万象的动词功能
【发布时间】:2018-08-02 13:14:30
【问题描述】:

对于使用 ASP.NET Core 的 Razor 页面,有没有办法为所有动词创建一个包罗万象的处理程序,而不是使用单独的 OnGet()、OnPost()。处理程序将需要访问 HttpContext 和 Request 对象(未在构造函数中提供)

代替

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

也可以工作只是在每个请求之前或之后(带有上下文)执行的通用方法

【问题讨论】:

    标签: asp.net-core razor-pages


    【解决方案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));
                });
    

    【讨论】:

      【解决方案2】:

      如果要对所有请求方法执行一组命令,可以使用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
          }
      }
      

      【讨论】:

      • 处理程序需要访问 HttpContext 和 Request 对象(在构造函数中不可用)。我对这个问题做了一些澄清。
      • 然后你必须为所有动词添加方法。所有这些方法都将调用一个方法,该方法将包含您要执行的公共代码。
      • 我改变了答案。我添加了一个新的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多