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

C# 使用自定义视图库在Razor视图中调用异步函数,c#,asp.net-mvc,razor,asp.net-mvc-5,async-await,C#,Asp.net Mvc,Razor,Asp.net Mvc 5,Async Await,在我的MVC5应用程序中,如果用户没有RAZOR的权限,某些视图组件不会在RAZOR中呈现 权限是使用与应用程序其余部分完全异步的存储库模式获取的 我实现了一个具有以下方法的IPermission服务 public interface IPermissionService { Task<bool> IsUserAllowed(string moduleName, string action); Task<bool> IsUserAdmin(); }

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

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

我实现了一个具有以下方法的IPermission服务

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

    Task<bool> IsUserAdmin();
}
公共接口IPermissionService
{
任务IsUserAllowed(字符串moduleName、字符串操作);
任务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()
    {

    }
}
public抽象类ViewBase:WebViewPage其中T:class
{
公共IPermissionService权限;
公共重写void InitHelpers()
{
base.InitHelpers();
权限=DependencyResolver.Current.GetService();
}
公共覆盖无效执行()
{
}
}
在我看来,我无法使用这些异步函数,因为wait在那里不起作用。我不想为数据存储库创建一个单独的非异步实现。另外,我觉得通过像Task.Result()这样的操作调用异步函数而不等待也是不好的


有更好的方法吗?

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

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

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


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

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


将权限检索作为控制器逻辑的一部分,而不是视图逻辑,这不是更好吗?是的,我想这样做。但是我如何将它传递给视图呢?Viewbag?用户登录时,权限也会加载并存储在缓存/会话中。它更像是一种IsAllowed()类型的检查,我需要在视图中执行这种检查,并且不希望在视图中有一块代码。这就是在一个单独的helper类中编写它的主要思想。@Yash:现在任何解决方案都将是一种攻击。嗯,我不想那样做。首先,因为我觉得不渲染组件(比如不显示添加按钮)更安全。而且我需要使用的不仅仅是权限服务。根据用户的语言偏好,我的所有标签和标题都来自数据库。因此,我想使用另一个注入到视图库中的服务/帮助程序来实现这一点。也不能使用静态函数,因为这需要针对每个用户实例。