我试图使用我的CUSTOM视图页面(继承自ExecuteAsync()
)来挂钩呈现剃刀页面的RazorPage
调用。在RazorPage
类中有这种抽象方法:
public abstract Task ExecuteAsync();
在解析.cshtml文件(视图)时,在razor生成的输出中调用该方法。
显然,我不能只是覆盖它,因为我永远不会从生成的视图中调用它,这也会覆盖此方法(虽然这样会很好,并且至少可以解决部分问题)。
在.Net核心中是否有任何特殊的剃刀技巧,我可以在渲染过程之后在 AND 之前拦截? (使用我的自定义类)
答案 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(...)
方法。