我正在尝试根据我要查看的页面来修改页面的某些部分,这是一个好主意。我可以使用页面的 Controller 设置某些元素,但我正在考虑全局导航菜单(当前在应用程序的MasterPage中使用RenderAction呈现)的事件状态。

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

问题标签|用户| ...

如果我在“问题”区域或页面中,那么我希望“问题”链接处于事件状态并使用其他颜色。

我不想在每个页面上都进行管理,而且我也不想将值发送到我的母版页中,然后再通过RenderAction发送它,因为我认为那是一团糟。我想要的操作是仅知道渲染页面所在的区域并突出显示必要的元素。

最佳答案

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

同样,如果使用局部 View 进行导航,则可以通过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的引用,因此您甚至无需确定 View 中的当前 Controller 。请注意,我仅显示一个签名,您可以根据需要添加其他签名来处理其他路由数据和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 );
    }
}

关于asp.net-mvc - 我该如何知道我在ASP.NET MVC应用程序中位于哪个页面上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2111748/

10-12 12:41
查看更多