好吧,看起来你必须使用ViewResultExecutor
。经过更多的代码探索后,我发现执行器被用来调用第一个ExecuteAsync()
在嵌套链中ExecuteAsync
来电。 ;)
public class MyViewResultExecutor : ViewResultExecutor
{
....
public override Task ExecuteAsync(ActionContext actionContext, IView view, ViewResult viewResult) ....
....
}
....
services.TryAddSingleton<ViewResultExecutor, MyViewResultExecutor>();
The ViewResultExecutor
服务对象获取于ViewResult.ExecuteResultAsync(ActionContext context)
.
很棒的是您还可以通过以下方式访问自定义页面类型view
范围 ((view as RazorView)?.RazorPage
)。 ;)(当然,您必须将其转换为您的自定义类型)
(我开始讨论here最初,如果有人有兴趣阅读有关 ASP.Net Core MVC 源方面的更多详细信息)
Update:自最初发布以来,此流程已发生变化。这是注册您自己的执行器的新方法:
services.TryAddSingleton<IActionResultExecutor<ViewResult>, MyViewResultExecutor>();
// ... or ...
services.TryAddSingleton<IActionResultExecutor<PartialViewResult>, MyPartialViewResultExecutor>();
请注意TryAdd
部分。这意味着如果它已经存在,它将不会添加它。这与 MVC 代码尝试执行的操作相同,因此您必须在 MVC 之前先注册您的代码。另外,如果源自ViewResultExecutor
(而不是它实现的接口){ViewResultExecutor}.ExecuteAsync(...)
签名已更改且无法再被覆盖。您只能覆盖基础{ViewExecutor}.ExecuteAsync(...)
现在的方法。