Asp.net mvc 在ASP.NET MVC应用程序中,如何判断我在哪个页面上

Asp.net mvc 在ASP.NET MVC应用程序中,如何判断我在哪个页面上,asp.net-mvc,Asp.net Mvc,我正试图了解如何根据我所看到的页面修改页面的某些部分。我可以使用页面的控制器设置某些元素,但我更多地考虑全局导航菜单的活动状态(当前在应用程序的母版页中使用RenderAction呈现) 比如我在屏幕顶部有一些导航链接(以SO为例) 问题|标签|用户| 如果我在“问题”区域或页面,那么我希望问题链接以不同的颜色激活 我不想在每个页面上都管理这个,而且我不想将值发送到我的母版页,然后通过渲染发送它,因为我认为这会很混乱。我想要的是只知道呈现页面所在区域并突出显示必要元素的操作。ViewMaster

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

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

问题|标签|用户|

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


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

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

类似地,如果使用局部视图进行导航,则可以通过ViewUserControl上的ViewContext属性访问RoutedData

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

<%
   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 );  
    }
}
  • ...
公共静态类HtmlHelperExtensions { 公共静态字符串导航链接(此HtmlHelper帮助程序, 字符串文本, 弦作用, 字符串控制器) { 字符串current=helper.ViewContext.RouteData.Values[“controller”]作为字符串; 对象属性=null; if(string.Equals(当前、控制器、StringComparison.OrdinalIgnoreCase)) { attributes=new{@class=“highlight”}; } 返回此.ActionLink(文本、操作、控制器、null、属性); } }
这应该从视图本身进行控制。 如果不想修改每个视图,可以创建用户视图控件(.ascx文件)并将其添加到母版页

好问题

在过去,我通过检查来自控制器和操作的RoutedData值来解决这个问题。
但是现在我正在使用MvcContrib MenuBuilder来完成这种工作。查看他们的示例代码,了解如何处理此问题。

第页中给出了以下内容。母版:

<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定义,使页面看起来与该特定视图的外观一致。

    Ok,然后在用户视图控件中,我将如何告知我在哪个页面上?这是我的问题。很酷,我不知道。让我试一试,看看这是否对我有效。这比它需要的复杂得多。将ViewContext.RoutedData[“controller”]更改为ViewContext.RoutedData.Values[“controller”]对我有效:)谢谢你的帮助。哇。谈论脆性——你必须在每一页上都这样做,否则它就坏了。我更愿意编写一个导航系统的小代码,而不是将所有这些嵌入式风格的东西分散在我所有的视图中。如果您决定更改突出显示的方式,该怎么办?然后你需要到处去改变它。恶心,脆吗?哈哈。至少你可以在不需要重新编译的情况下更改你的视图。此外,这允许设计师控制视图的外观(顺便说一句,这是他们的工作),而不是程序员。您可以让设计师通过让他们设计您应用的CSS类来控制页面的外观。然后,您仍然可以通过更改样式表来动态更改l&f,而不是访问每个视图页面并更改代码。我想我可以,但如果我在“用户”下面有20个(子)页面,并且对于每个页面,我只想突出显示该链接,而不是真的希望对每个页面都这样做。我想我可能会很懒,但我有4个主要部分和80页,正好放在这些部分下面…我想这还有另一个问题,这可能是一件小事,但如果您有多件事情需要更改状态,那么您将不得不拥有许多不同的页面级样式的css,这些css不是缓存的,或者其他的。您将在源代码包MvcContrib.Samples.UI解决方案中的Samples文件夹中找到示例。今天没有看到它…希望明天能看到。