asp.net mvc 中开关内的 if 语句
本文关键字:if 语句 开关 net mvc asp | 更新日期: 2023-09-27 18:37:11
我有一个基于上下文的菜单,该菜单基于当前活动控制器显示,如下所示:
@switch (this.ViewContext.RouteData.Values["controller"].ToString().ToLower())
{
case "unitdetails":
Html.RenderPartial("_ContextMenu");
break;
case "operation":
Html.RenderPartial("_ContextMenu");
break;
case "trend":
Html.RenderPartial("_ContextMenu");
break;
case "wellguide":
Html.RenderPartial("_ContextMenu");
break;
case "setup":
Html.RenderPartial("_ContextMenu");
break;
case "site":
Html.RenderPartial("_ContextMenu");
break;
case "alarms":
Html.RenderPartial("_ContextMenu");
break;
case "asx":
Html.RenderPartial("_ContextMenu");
break;
case "reports":
}
直到今天工作正常,我遇到了一个问题。我的控制器有几个不同的操作,但菜单不会与所有操作一起显示。因此,我需要在"报告"案例中进行检查,以检查当前操作是否应该渲染我的_ContextMenu
。
类似这样的事情是否合适:
case "reports":
if (this.ViewContext.RouteData.Values["action"].ToString().ToLower() == "unitactivity")
{
Html.RenderPartial("_ContextMenu");
break;
}
else
{
goto default;
}
我似乎无法让它工作,因为它抛出了一个异常说(注意:我删除了命名空间): Message='UnitActivityModel' does not contain a definition for 'ViewUnitContract'
这适用于交换机中的所有其他情况,但是在开始检查当前操作时会出现麻烦。 有什么建议吗?其他控制器使用相同的UnitActivityModel
,在视图中使用强类型。
将
如此多的决策代码放在视图中通常是一个坏主意。在可能的情况下,将视图留给数据,并将决策推回控制器(或最坏的情况推回部分视图,yuk)。
在您的情况下,与其尝试类似Html.RenderPartial
不如尝试类似的东西
@Html.Action("ContextMenu", "Menu", new { id = this.ViewContext.RouteData.Values["controller"].ToString().ToLower() })
或者您更喜欢内联代码样式:
Html.RenderAction("ContextMenu", "Menu", new { id = this.ViewContext.RouteData.Values["controller"].ToString().ToLower() });
这会将当前控制器名称传递给MenuController.ContextMenu(string id)
操作方法,其中 id 接收控制器名称。
我个人的偏好是使用 [Bind]
拥有有意义的参数名称(我讨厌通用id
):
例如
MenuController.ContextMenu([Bind(Prefix="id")]string controllerName)
然后,您可以在菜单控制器中做出决定并返回部分(或许多部分之一),甚至return EmptyResult()
(对于无菜单)。
此额外控制器调用的结果将就地呈现,就像任何其他分部视图一样。