【发布时间】:2018-06-05 07:49:13
【问题描述】:
我正在尝试制作动态菜单(存储在数据库中),该菜单显示在所有 Web 应用程序页面上。 使用 Google 我发现将菜单视图作为主视图 (_Layout.cshtml) 的一部分会更好。正因为如此,控制器的每个动作方法都必须包含菜单模型的数据。为了避免代码重复,我找到了创建基本控制器并使用其构造函数提供数据的解决方案:
另外,我正在尝试使用异步/等待可能性,而我的 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();
}
}
我知道这是BAD CODE,但我不知道如何正确设计这种情况。也许有另一种更好的方法来创建动态菜单或另一种异步获取数据的方法?
另外,我找到了这篇文章,但我不知道我是否可以应用它的解决方案,因为我不知道我是否可以处理控制器实例的创建:
http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html
【问题讨论】:
-
那是糟糕的设计,你是对的。您应该改用中间件或操作过滤器
-
感谢您的回复!您能否提供一些具有适当设计的文章的链接?因为我搜索了大约 1-2 小时来找到如何实现动态菜单。
-
这听起来很适合Child Action。另请参阅此问题stackoverflow.com/questions/21948909/…
-
@Jasen,RenderAction 不能调用异步操作
标签: c# asp.net-mvc async-await