使用自定义视图库在 Razor 视图中调用异步函数

本文关键字:视图 调用 异步 函数 Razor 自定义 | 更新日期: 2023-09-27 18:34:18

在我的 MVC5 应用程序中,如果用户没有某些视图组件的权限,则某些视图组件不会在 RAZOR 中呈现。

权限是使用存储库模式获取的,该模式与我的应用程序的其余部分完全异步。

我实现了具有以下方法的 IPermission Service

public interface IPermissionService 
{
    Task<bool> IsUserAllowed(string moduleName, string action);
    Task<bool> IsUserAdmin();
}

现在,为了能够在我的视图中使用此服务,我编写了一个自定义视图库,该库继承自WebViewPage,如下所示:

public abstract class ViewBase<T> : WebViewPage<T> where T : class
{
    public IPermissionService Permissions;
    public override void InitHelpers()
    {
        base.InitHelpers();
        Permissions= DependencyResolver.Current.GetService<IPermissionService>();
    }
    public override void Execute()
    {
    }
}

我无法从我的视图中使用这些异步函数,因为 await 在那里不起作用。我不想创建数据存储库的单独非异步实现。另外,我觉得通过执行类似 Task.Result() 之类的操作来调用没有等待的异步函数也不是一个好主意,因为调用没有 await 的异步方法#2

有没有更好的方法

使用自定义视图库在 Razor 视图中调用异步函数

您可以尝试将这些资源的加载与视图的加载分离。

视图本身应加载所有用户有权访问的所有项目。

当视图在客户端呈现时,将异步 ajax 调用发送回服务器上的操作,该操作将评估用户有权查看的内容,并将返回用于客户端加载的相应数据/模型。

这样,您就不必担心在视图中运行异步服务器代码,并且仍然可以完全控制用户可以看到的内容(这也是异步的)

这似乎是依赖注入的一个很好的候选者。例如,查看Autofac对属性注入的建议:

http://docs.autofac.org/en/latest/integration/mvc.html#enable-property-injection-for-view-pages