根据ASP.NET MVC中的控制器更改菜单

时间:2009-06-14 18:53:48

标签: asp.net-mvc

在母版页中,我怎么知道我目前使用的是哪个控制器?是否有某种上下文对象,可以给我那种信息?

标准菜单

<ul>
<li>Fire</li>
<li>Ice</li>
<li>Water</li>
</ul>

菜单,如果我在水控制器

<ul>
<li>Fire</li>
<li>Ice</li>
<li class="selected">Water</li>
</ul>

如果我的Site.master中有一个菜单,其中每个菜单项指的是不同的控制器,我如何根据我目前所在的控制器突出显示每个菜单项?

我知道我可以从request.Servervariables获取url然后使用一些字符串魔法,但必须有更好的方法 - 某种上下文对象?

3 个答案:

答案 0 :(得分:2)

ViewMasterPage的ViewContext属性包含请求的Controller和RouteData。您可以查看控制器的类型名称或路由数据中的controller键,以找出调用的控制器。

答案 1 :(得分:1)

你可以做一个

  

ViewContext.Controller.GetType()。名称

应该这样做。

答案 2 :(得分:1)

这里有两个辅助方法,用于检查它是当前控制器还是当前操作。您可以使用帮助程序来确定是否添加class =“selected”。

public static bool IsCurrentController(this HtmlHelper helper, 
                                       string controllerName)
{
    string currentControllerName = (string)helper.ViewContext.RouteData.
                                   Values["controller"];

    if (currentControllerName.Equals(controllerName,
        StringComparison.CurrentCultureIgnoreCase))
    {
       return true;
    }

    return false;
}

public static bool IsCurrentAction(this HtmlHelper helper, string actionName, 
                                   string controllerName)
{
    string currentControllerName = (string)helper.ViewContext.RouteData
                                   .Values["controller"];
    string currentActionName = (string)helper.ViewContext.RouteData
                               .Values["action"];

    if (currentControllerName.Equals(controllerName,
        StringComparison.CurrentCultureIgnoreCase) && 
        currentActionName.Equals(actionName, 
                                 StringComparison.CurrentCultureIgnoreCase))
    {
        return true;
    }

    return false;
}