-1

我有一个基于上下文的菜单,它根据当前活动控制器显示,如下所示:

@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的强类型视图。

4

1 回答 1

1

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

这个额外的控制器调用的结果被渲染到位,就像任何其他的局部视图一样。

于 2014-05-30T09:27:49.573 回答