我正在尝试制作动态菜单(存储在数据库中),该菜单显示在所有网络应用程序页面上。 使用 Google 我发现最好将菜单 View 作为主视图 (_Layout.cshtml) 的一部分。因此, Controller 的每个操作方法都必须包含菜单模型的数据。为了避免代码重复,我找到了创建基本 Controller 并使用其构造函数提供数据的解决方案:
此外,我正在尝试使用异步/等待可能性,并且我的 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 不能异步。您仍然可以调用异步方法,它只会运行同步。
关于c# - 构造函数 Controller 中的 MVC 异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945205/