挂钩ASP.Net Core

时间:2017-04-07 00:31:46

标签: asp.net-core asp.net-core-mvc

我试图使用我的CUSTOM视图页面(继承自ExecuteAsync())来挂钩呈现剃刀页面的RazorPage调用。在RazorPage类中有这种抽象方法:

public abstract Task ExecuteAsync();

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

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

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

1 个答案:

答案 0 :(得分:3)

好的,看起来你必须使用ViewResultExecutor。在更深入地了解代码之后,我发现执行程序用于调用嵌套ExecuteAsync()调用链中的第一个ExecuteAsync。 ;)

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

ViewResultExecutor服务对象来自ViewResult.ExecuteResultAsync(ActionContext context)

最棒的是,您还可以通过view参数((view as RazorView)?.RazorPage)访问自定义网页类型。 ;)(当然,你必须将它投射到你的自定义类型)

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

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

services.TryAddSingleton<IActionResultExecutor<ViewResult>, MyViewResultExecutor>();
// ... or ...
services.TryAddSingleton<IActionResultExecutor<PartialViewResult>, MyPartialViewResultExecutor>();

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