当前位置: 首页 > news >正文

转:MVC 下导航超链接本页面高亮的一种解决方案

前言

导航高亮一直是一个让大家头疼的问题。

纯 Javascript 的话可以判断当前页面的地址和链接地址是否有关系。

这样的弊端就是自由度太低,MVC 下会出一定的问题 (MVC 下有默认的 Controller 和 Action)

另一种方案是前端后端结合,为每一张页面设置一个属性,然后在页面中判断。满足条件便高亮。

这样的弊端就是,需要为你所有的页面设置属性,非常麻烦!

那么有没有什么完美的解决方案?一劳永逸的?

神奇的 eval 函数

Javascript 有精粹也有糟粕,其中的 eval 是大多数动态语言都拥有的精髓。我们是否可以利用这个函数呢?

基本思路:

给每一个 li(对应一个链接)设置一个 class,例如 class=”controller_Home”,

代表着,只要这张页面是的 controller 是 Home,就让这个链接高亮。

而在页面中,是可以通过代码直接得到 controller 和 action 的名称的,没必要为每一张页面单独手动设置。

解决方案

 

<ul id="top-navigation">
    <li class="controller_Home"><span><span>@Html.ActionLink("Ê×Ò³","Index","Home")</span></span></li>
    <li class="controller_Article"><span><span>@Html.ActionLink("ÎÄÕ¹ÜÀí","Index","Article")</span></span></li>
    <li class="controller_User"><span><span>@Html.ActionLink("Óû§¹ÜÀí","Index","User")</span></span></li>
</ul>
<input id="controller" type="hidden" value="@Html.ViewContext.RouteData.Values["controller"]"/>
<input id="action" type="hidden" value="@Html.ViewContext.RouteData.Values["action"]"/>

View 中的代码如上所示:

  1. 首先给所有的 li 加上一个 class
  2. 然后再利用两个 hidden ,把 controller 和 action 的名字放到前端页面中
$(function () {
    SetNavClass('top-navigation', 'active');
});
 
function SetNavClass(ulId, className) {
    controller = $('#controller').val();
    action = $('#action').val();
    eval('controller_' + controller + ' = true');
    eval('action_' + action + ' = true');
    list = $('#' + ulId + '>li');
 
    for (var k = 0; k < list.length; k++) {
        item = list[k];
        str = GetClassName(item);
        try {
            if (eval(str)) $(item).addClass(className);
        } catch (e) { }
    }
}
function GetClassName(item) {
    classes = $(item).attr('class').split(' ');
    for (var k = 0; k < classes.length; k++) {
        if (classes[k].indexOf('controller') > -1 || classes[k].indexOf('action') > -1) return classes[k];
    }
}

以上是 Javascript 的代码:

  1. 读取 controller 和 action 的名字
  2. 利用 eval 函数给 controller_[controller名字] 和 action_[action名字] 这两个变量赋值
  3. 取出 class 中的表达式
  4. 利用 eval 函数执行表达式,判断最后的结果,如果满足条件就加上高亮的 class

上述代码不需要为每个页面编写,只需要在母版页中编写一次即可,再引用这段 Javascript 函数。

如果你的 ul ID 和 高亮 class 名字不一样,那么只要在调用这个函数的时候传入你自己的就行了。

高级应用

就这么简单?仅此而已?

如果真的是这样,那么完全可以直接利用 Javascript 判断页面地址来实现。

那么让我们来玩一些好玩的吧~

因为是 eval 函数,所以完全可以在这个 class 中编写复杂的表达式(其实就是 Javascript 表达式)

 

<li class="controller_Home||controller_About"><span><span>@Html.ActionLink("首页", "Index", "Home")</span></span></li>
<li class="controller_Article&&action_Add"><span><span>@Html.ActionLink("文章管理", "Index", "Article")</span></span></li>

以上两行代码表示:

  1. controller 只要是 Home,或者 About,都会激活这个链接
  2. controller 必须是 Article,action 必须是 Add

也就是说,在这个 class 里可以输入复杂的 Javascript,这样就可以实现复杂的导航激活功能了!

相关文章:

  • ECSHOP的订单状态
  • 创建正真的Java不可变类
  • 创建Java不可变型的枚举类型Gender
  • hibernate 关系映射之 单向外键关联一对一
  • (转)原始图像数据和PDF中的图像数据
  • 基于HTML5技术的电力3D监控应用(四)
  • 创客运动引发第三次工业革命
  • php错误级别的设置方法
  • 案例参考:分享一个回报率1:3.5的热门竞价赚钱项目
  • paip.调试js 查看元素事件以及事件断点
  • UBUNTU 12.04安装ORACLE
  • 一段小代码
  • sso单点登录研究
  • 字符串处理总结之一(C#String类)
  • 独立游戏开发者如何利用媒体造势
  • 10个确保微服务与容器安全的最佳实践
  • cookie和session
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • js继承的实现方法
  • Mac转Windows的拯救指南
  • MySQL的数据类型
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • ReactNative开发常用的三方模块
  • Redis在Web项目中的应用与实践
  • 创建一个Struts2项目maven 方式
  • 从零开始在ubuntu上搭建node开发环境
  • 汉诺塔算法
  • 利用jquery编写加法运算验证码
  • 深度学习中的信息论知识详解
  • 深入 Nginx 之配置篇
  • 思否第一天
  • 微信开源mars源码分析1—上层samples分析
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  •  一套莫尔斯电报听写、翻译系统
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • Spring第一个helloWorld
  • ###C语言程序设计-----C语言学习(3)#
  • (1)STL算法之遍历容器
  • (C语言)fread与fwrite详解
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计高校学生选课系统
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十六)Flask之蓝图
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)kafka实战——kafka源码编译启动
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)详解PHP处理密码的几种方式
  • ***监测系统的构建(chkrootkit )
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .Net mvc总结
  • .NET NPOI导出Excel详解
  • .NET 服务 ServiceController
  • .net 托管代码与非托管代码