c# - _Layout.cshtml 上的 MVC 决策

标签 c# asp.net-mvc inversion-of-control

所以我环顾四周,似乎找不到合适的解决方案来解决我的问题。

问题

在我的布局中,我希望能够根据数据库中的内容选择运行时是否存在导航项:

当前布局(导航栏)

<div class="navbar-collapse collapse">
   <ul class="nav navbar-nav">
       <li>@Html.ActionLink("Dashboard", "Index", "Dashboard")</li>
           <li>@Html.ActionLink("NzbGet", "Index", "NzbGet")</li>
              <li>@Html.ActionLink("Plex", "Index", "Plex")</li>
              <li>@Html.ActionLink("Settings", "Index", "Settings")</li>
           </ul>
       </div>

我如何能够决定要显示哪一个:

public PrincipleExtension(ISettingsService<SabNzbSettingsDto> sab)
{
    SabService = sab;
}

private ISettingsService<SabNzbSettingsDto> SabService { get; set; }    
public bool IsApplicationEnabled(IPrincipal principal, Applications application)
{
    switch (application)
    {
        case Applications.SabNZBD:
            return SabService.GetSettings().Enabled;
            //...
     }
     return false;
 }

现在,PrincipleExtension 最初是 IPrincipal 上的扩展方法。但现在这是不可能的,因为我使用的是 IoC 容器,并且不想对任何依赖项进行硬编码。

因此,在它是静态方法之前,我可以执行User.IsApplicationEnabled(Applications.SabNZBD)

我现在如何检查应用程序在布局中是否已将启用标志设置为 true?有什么想法吗?

谢谢。

最佳答案

将菜单 HTML 移至 PartialView 并使其作为 ActionResult 从 Controller 操作返回。

<div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
        @foreach (var item in Model)
        {
            <li><a href="@item.Url">@item.Name</a></li>
        }
    </ul>
</div>

让 Controller 确定要显示哪些菜单项并将新模型发送到 PartialView。

public ActionResult ProductsMenu()
{
    var listOfAvailableProducts = GetAvialableProducts(Principal); //to implement elsewhere
    var productsMenuItems = new List<ProductMenuItem>();

    for(var i in listOfAvailableProducts)
    {
        productsMenuItems.Add(new ProductMenuItem
            {
                Id = i.id,
                Name = i.name,
                Url = "//example.com/there"
            }
        );
    }

    return PartialView("/path/to/_ProductsMenu.cshtml", productsMenuItems);
}

然后在 _Layout.cshtml razor View 中调用它,如下所示:

@{ Html.RenderAction("ActionName","ControllerName"); }

关于c# - _Layout.cshtml 上的 MVC 决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071297/

相关文章:

c# - C# 中的多线程启动画面?

c# - 如何从字典对象中获取值?

html - 如何防止在 Razor(独立)中转义 html?

c# - MVC4 验证不起作用

c# - Lambda 变量作用域

asp.net-mvc - 如何找到所有以 a 或 â 开头的项目?

c# - Ninject 根据顶级项目获得不同实现的最佳实践

inversion-of-control - .Net 的最佳 IoC 框架

java - 如何使用 guice 实现全局状态?

c# - 如何验证签名,从 PEM 文件加载公钥?