繁体   English   中英

使用自定义视图库在Razor视图中调用异步功能

[英]Calling async function in a Razor View using a Custom View Base

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

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

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

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

    Task<bool> IsUserAdmin();
}

现在,为了能够在我的视图中使用此服务,我编写了一个自定义View Base,它继承自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()
    {

    }
}

我无法在我的View中使用这些异步函数,因为等待在那里工作。 我不想创建数据存储库的单独的非异步实现。 我也觉得调用一个异步函数而不等待像Task.Result()这样的事情也不是一个好主意,因为根据调用异步方法没有等待#2

有没有更好的方法呢?

您可以尝试从加载视图中解耦这些资源的加载。

您的视图本身应该加载所有用户都有权限的所有项目。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM