如何判断我在ASP.NET MVC应用程序中的页面

时间:2010-01-21 18:21:13

标签: asp.net-mvc

我正在尝试根据我正在查看的页面来了解如何修改页面的某些部分。我可以使用页面的控制器设置某些元素,但我正在考虑更多关于全局导航菜单(当前正在应用程序的MasterPage中使用RenderAction呈现)活动状态。

就像我在屏幕顶部有一些导航链接一样(以SO为例)

问题|标签|用户| ...

如果我在“问题”区域或页面中,那么我希望“问题”链接以不同的颜色激活。

我不想在每个页面上管理这个,而且我不想将值发送到我的母版页然后通过RenderAction发送它,因为我觉得它很混乱。我想要的是Action,只知道渲染页面所在的区域并突出显示必要的元素。

4 个答案:

答案 0 :(得分:6)

ViewMasterPage具有ViewContext属性。 ViewContext包含RouteData。 RouteData应该有一个控制器名称和当前操作的条目(如果它们不是默认值)。您可以在母版页的逻辑中使用这些来确定要突出显示的导航元素。

同样,如果您使用局部视图进行导航,则可以通过ViewUserControl上的ViewContext属性访问RouteData。

编辑:我认为不需要复杂。

<%
   var current = this.ViewContext.RouteData.Values["controller"] as string ?? "home";
%>

<ul>
  <li><%= Html.ActionLink( "Home", "index", "home", null, new { @class = current == "home" ? "highlight" : "" } %></li>
  ...
</ul>

事实上,我甚至可以将它重构为HTML扩展,以使其更容易。事实证明,助手已经有了对ViewContext的引用,因此您甚至不需要确定视图中的当前控制器。请注意,我只显示一个签名,您可以根据需要添加其他签名来处理其他路径数据和html属性(这些属性需要合并)。

<ul>
  <li><%= Html.NavLink( "Home", "index", "home" ) %></li>
  ...
</ul>

public static class HtmlHelperExtensions
{
    public static string NavLink( this HtmlHelper helper,
                                  string text,
                                  string action,
                                  string controller )
    {
          string current = helper.ViewContext.RouteData.Values["controller"] as string;
          object attributes = null;
          if (string.Equals( current, controller, StringComparison.OrdinalIgnoreCase ))
          {
              attributes = new { @class = "highlight" };
          }

          return this.ActionLink( text, action, controller, null, attributes );  
    }
}

答案 1 :(得分:3)

好问题!

过去我曾经通过检查控制器和动作的RouteData值来解决这个问题。 但现在我正在使用MvcContrib MenuBuilder来完成这项工作。查看他们的示例代码,看看如何使用它。

答案 2 :(得分:1)

在Page.Master中给出以下内容:

<head runat="server">
    <link href="Standard.CSS" rel="stylesheet" type="text/css" />
    <asp:ContentPlaceHolder ID="header" runat="server" />
</head>
<!-- and later on in the file -->
<ul>
  <li>
    <a href="/questions" class="question">Questions</a>
  </li>
  <li>
    <a href="/questions" class="user">Users</a> 
  </li>
</ul>

在视图Users.aspx中:

<asp:Content ID="header" ContentPlaceHolderID="header" runat="server">
    <title>User's Page</title>
    <style type="text/css">
        .user
        {
            background-color:yellow;
        }
    </style>
</asp:content>

所以你不必做任何奇怪的路线解析或推迟或推迟。您只需在母版页的标题中添加ContentPlaceHolder,然后在每个视图中在此内容占位符中提供一些额外的CSS定义,使页面看起来应该如何为该特定视图。

答案 3 :(得分:0)

这应该从视图本身控制。 如果您不想修改每个视图,可以创建用户视图控件(.ascx文件)并将其添加到母版页。