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,在视图中使用强类型。

asp.net mvc 中开关内的 if 语句

如此多的决策代码放在视图中通常是一个坏主意。在可能的情况下,将视图留给数据,并将决策推回控制器(或最坏的情况推回部分视图,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()(对于无菜单)。

此额外控制器调用的结果将就地呈现,就像任何其他分部视图一样。