所以我环顾四周,似乎找不到合适的解决方案来解决我的问题。
问题
在我的布局中,我希望能够根据数据库中的内容选择运行时是否存在导航项:
当前布局(导航栏)
<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/