asp.net-mvc – 如何判断我在ASP.NET MVC应用程序中的页面

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

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

问题|标签|用户| …

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

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

解决方法

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","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,attributes );  
    }
}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....