【问题标题】:Calling async function in a Razor View using a Custom View Base使用自定义视图库在 Razor 视图中调用异步函数
【发布时间】:2015-02-13 12:29:44
【问题描述】:

在我的 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 在那里不起作用。我不想创建数据存储库的单独非异步实现。另外,我觉得根据call async method without await #2

,通过执行诸如 Task.Result() 之类的操作来调用异步函数而不等待也不是一个好主意

有更好的方法吗?

【问题讨论】:

  • 将权限检索作为控制器逻辑的一部分而不是视图逻辑不是更好吗?
  • 是的,我想这样做。但是我如何将它传递给视图?查看包?
  • 在用户登录时,权限也会被加载并存储在缓存/会话中。它更像是一种 IsAllowed() 类型的检查,我需要在视图中执行并且不希望在视图中有代码块。这是在单独的帮助类中编写它的主要思想。
  • @Yash:现在任何解决方案都将是一个 hack。 ASP.NET vNext will have proper support for await in razor views.

标签: c# asp.net-mvc razor asp.net-mvc-5 async-await


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好吧,我不想那样做。首先是因为我觉得不渲染组件(比如不显示添加按钮)更安全。而且它不仅仅是我需要使用的许可服务。我所有的标签和标题都来自基于用户语言偏好的数据库。所以我想使用另一个注入到视图库中的服务/助手来做到这一点。也不能使用静态函数,因为这需要每个用户实例。
    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多