挂钩 ASP.Net Core 的剃刀页面执行

Jam*_*ins 2 asp.net-core-mvc asp.net-core

我正在尝试ExecuteAsync()使用我的 CUSTOM 视图页面(继承自RazorPage)连接到呈现剃刀页面的调用。在RazorPage类中有这个抽象方法:

public abstract Task ExecuteAsync();
Run Code Online (Sandbox Code Playgroud)

在解析 .cshtml 文件(视图)时,会在 razor 生成的输出中调用该方法。

显然,我不能只是覆盖它,因为我的永远不会从生成的视图中被调用,这也覆盖了这个方法(尽管这很好,并且至少解决了部分问题)。

.Net 核心中是否有任何特殊的剃刀技巧,我可以在渲染过程之前和之后拦截?(使用我的自定义类)

Jam*_*ins 6

好的,看来您必须使用ViewResultExecutor. 在深入研究代码之后,我发现执行器被用来调用ExecuteAsync()嵌套ExecuteAsync调用链中的第一个。;)

public class MyViewResultExecutor : ViewResultExecutor
{
    ....
    public override Task ExecuteAsync(ActionContext actionContext, IView view, ViewResult viewResult) ....
    ....
}
....
services.TryAddSingleton<ViewResultExecutor, MyViewResultExecutor>();
Run Code Online (Sandbox Code Playgroud)

的ViewResultExecutor服务对象获得ViewResult.ExecuteResultAsync(ActionContext context)。

最棒的是您还可以通过view参数 ( (view as RazorView)?.RazorPage)访问您的自定义页面类型。;)(当然,您必须将其转换为自定义类型)

(如果有人有兴趣阅读有关 ASP.Net Core MVC Source 方面的更多详细信息,我最初在这里开始了讨论)

更新:自最初发布以来,此过程已更改。这是注册您自己的执行程序的新方法:

services.TryAddSingleton<IActionResultExecutor<ViewResult>, MyViewResultExecutor>();
// ... or ...
services.TryAddSingleton<IActionResultExecutor<PartialViewResult>, MyPartialViewResultExecutor>();
Run Code Online (Sandbox Code Playgroud)

请注意TryAdd部分。这意味着如果它已经存在,它将不会添加它。这与 MVC 代码试图做的事情是一样的,所以你必须在 MVC 之前先注册你的。此外,如果派生自ViewResultExecutor(而不是它实现的接口),则{ViewResultExecutor}.ExecuteAsync(...)签名已更改并且不能再被覆盖。您现在只能覆盖基本{ViewExecutor}.ExecuteAsync(...)方法。