c# - 构造函数 Controller 中的 MVC 异步方法

标签 c# asp.net-mvc async-await

我正在尝试制作动态菜单(存储在数据库中),该菜单显示在所有网络应用程序页面上。 使用 Google 我发现最好将菜单 View 作为主视图 (_Layout.cshtml) 的一部分。因此, Controller 的每个操作方法都必须包含菜单模型的数据。为了避免代码重复,我找到了创建基本 Controller 并使用其构造函数提供数据的解决方案:

https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/views/passing-data-to-view-master-pages-cs

此外,我正在尝试使用异步/等待可能性,并且我的 PageService(菜单)正在使用 ToListAsync() 从数据库获取数据。所以现在我遇到了一个问题,即 BaseController 构造函数有一个异步方法:

public class BaseController : AsyncController, IBaseController
{
    private readonly IPageService _pageService;

    public BaseController(IPageService pageService)
    {
        _pageService = pageService;
        SetBaseViewModelAsync();
    }

    private async Task SetBaseViewModelAsync()
    {
        ViewData["Pages"] = await _pageService.GetAllAsync();
    }
}

我知道这是错误代码,但我不知道如何正确设计这种情况。也许有另一种更好的方法来创建动态菜单或另一种异步获取数据的方法?

另外,我找到了这篇文章,但我不知道我是否可以应用它的解决方案,因为我不知道我是否可以处理 Controller 实例创建:

http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html

最佳答案

您可以创建一个名为 MenuController 的 Controller ,创建一个名为 Default 然后从您的布局中调用它:

[ChildActionOnly]
public Default()
{
  var viewModel = _pageService.GetAllAsync();
  return Partial(viewModel);
}

在你的布局中:

@{Html.RenderAction("Default", "Menu");}

这确实是最简单、最干净的解决方案。最大的 PRO 是您可以控制与方法调用分开的菜单缓存。 asp.net-mvc (1-5) 没有好的解决方案以这种方式运行异步代码。 ( ActionFilters can't be async 和 (Render)Partials 不能异步。您仍然可以调用异步方法,它只会运行同步。

Render vs Non-Render Performance .

关于c# - 构造函数 Controller 中的 MVC 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945205/

相关文章:

c# - 使用泛型调用重载函数

c# - 压缩响应无效

asp.net-mvc - 使用 NLog 记录未处理的异常? ELMAH 和 NLog 应该一起使用吗?

c# - 如果至少有一个任务结束,如何关闭所有任务

使用 BouncyCaSTLe 使用 SHA-256 和 ECDSA 的 C# 签名数据每次都会产生不同的签名

c# - 未触发 MVC 5 远程验证

asp.net - IIS请求处理线程池与TPL线程池相同吗?

javascript - 在 promise 中有多个异步等待

asp.net - 将NUnit添加到ASP.NET MVC测试框架的选项中

javascript - 使用 JSON JavaScriptSerializer 进行序列化或反序列化期间的 ASP.NET MVC 错误。超过 maxJsonLength 属性上设置的值