代码之家  ›  专栏  ›  技术社区  ›  rball

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

  •  5
  • rball  · 技术社区  · 15 年前

    我想知道如何根据我看到的页面修改页面的某些部分。我可以使用页面的控制器设置某些元素,但我在考虑更多关于全局导航菜单(当前在应用程序的母版页中使用渲染进行渲染)的活动状态。

    比如我在屏幕顶部有一些导航链接(以SO为例)

    问题标签用户…

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

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

    4 回复  |  直到 15 年前
        1
  •  6
  •   tvanfosson    15 年前

    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扩展以使其更容易。结果发现该助手已经有了对视图上下文的引用,因此您甚至不需要确定视图中的当前控制器。请注意,我只显示一个签名,您可以根据需要添加其他签名来处理其他路由数据和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 );  
        }
    }
    
        2
  •  3
  •   IK    15 年前

    好问题!

    在过去,我通过检查控制器和操作的routedata值来解决这个问题。 但现在我用mvcontrib menubuilder来做这种工作。查看他们的示例代码以了解如何使用它。

        3
  •  1
  •   Will    15 年前

    在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>
    

    在view 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定义,使页面看起来应该如何用于该特定视图。

        4
  •  0
  •   David Espart    15 年前

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