右键菜单栏的详细教程,请查看《网页右键菜单栏制作(带鼠标属性)》
布局代码如下:
<!--右键菜单栏dom--> <div class="dom" @*style="display: none;"*@> <ul> <li> <a href="#" style="padding-top: 0;color: #ccc;">返回</a> <span style="color: #ccc;">Alt+向左箭头</span> </li> <li> <a href="#" style="color: #ccc;">前进</a> <span style="color: #ccc;">Alt+向右箭头</span> </li> <li> <a href="#">重新加载</a> <span>Ctrl+R</span> </li> <li> <a href="#">另存为...</a> <span>Ctrl+S</span> </li> <li> <a href="#">打印...</a> <span>Ctrl+P</span> </li> <li> <a href="#">映射...</a> <span>Ctrl+Z</span> </li> <li> <a href="#">修改</a> <span>Ctrl + F</span> </li> <li> <a href="#">删除</a> <span>Ctrl + D</span> </li> </ul> </div>
样式代码如下:
<style> * { padding: 0; margin: 0; } ul { list-style: none; } .dom { position: absolute; top: 0; left: 0; /* padding: 20px; */ text-align: left; width: 266px; /* height: 318px; */ border: 1px solid #ccc; } .dom li { position: relative; display: block; padding: 10px 30px; } i { display: inline-block; width: 100%; border-bottom: 1px solid #ccc; } .dom li span { position: absolute; bottom: 10px; right: 30px; } a { color: #000; text-decoration: none; } </style>
效果如下:
当我们通过布局出了样式之后,就先思考要如何的去完成这一个删除的功能。
1、当我们鼠标移动到tr行的时候,获取到他的坐标轴,超出tr不算
2、当菜单栏显示出来的时候我们鼠标选择到删除的选项
3、点击删除的时候将数据传递给控制器,进行删除操作
4、当数据删除是返回值,提醒我们是否要进行删除学生数据,否就是不删除
功能一:禁用浏览器的默认菜单栏
注意:如果我们不禁用浏览器右键菜单,就会出现菜单重叠,从而覆盖我们的自定义菜单
禁用是相对于整个文档来写的,不是写在方法里边
// 禁用浏览器的菜单栏 $(document).contextmenu(function (e) { return false; });
功能二:单机文档的任何一处都可以关闭菜单
// 单击隐藏菜单 $(document).click(function () { $("#dom").hide(); });
功能三:关键是调用方法的时候要传递事件对象event
对象输出值
通过对象获取到的鼠标坐标我们就可以完成下面的操作,右键显示自定义菜单,并将获取到达坐标赋值给left和top,就完成了鼠标哪里右键菜单出现在哪里的功能
// tr右键单机的时候调用 function mousMut(e) { // 获取事件对象 console.log(e); var x = e.pageX; var y = e.pageY; var key = e.which; if (key == 3) { // 左键是1 滚轮是2 右键是3 var x = e.pageX; var y = e.pageY; $("#dom").show().css({ left: x, top: y }); } }
功能四:当我们点击菜单中的删除时,回去到当前行的学生姓名,并弹出是否右进行删除,是删除否取消删除功能,如果删除通过$.post()的方法传递数据给行的控制器,并删除学生数据
功能四的第二种方法:通过刚开始动态添加tr行的时候在ID的前面追加多一个input的checked复选框选项,当我们选中复选框,选中状态为:checked的时候点击删除学生信息就弹出确认提示框,根据用户返回的值执行删除代码
最后样式代码:
追加代码如下:
<input class='mr-3' type='checkbox' value='" + data[index].StudentID + "' />"
因为前面我们已经通过追的方式把学生ID拼接给了val,现在我们获取到当前被选中的复选框的val学生ID,然后通过获取到的ID通过$.post()的方法传递给新建的控制器,这里通过第二种数据传递方式,拼接url的方式
// 点击删除学生信息 function deletionStudent() { // 获取到被选中的复选框 选中状态:checked var s = $("#StudentTable input:checked"); // console.log(s);输出当前的复选框 // 通过判断他的length个数执行代码 if (s.length == 1) { // 获取到复选框所在的val值 var StudentID = s.val(); // console.log(StudentID); // 通过获取到了val值传递给控制器删除数据 $.post("/AddedSql/deletionStudent?studentID=" + StudentID, function () { }); } else { alert("每次只能删除一次学生信息"); } }
接收方法,通过断点的方法查看是否右数据传递过来,获取到的ID是2
/// <summary> /// 接收删除学生信息的ID /// </summary> /// <param name="studentID">接收删除学生信息的ID</param> /// <returns></returns> public ActionResult deletionStudent(int studentID) { return Json("",JsonRequestBehavior.AllowGet); }
为了用户体验的更加的完整和严谨性,通过删除之后弹出选择框,如果选择确定我们就执行传递数据删除代码,然后取消我们就不执行
通过接收到的数据学生ID进行删除学生数据:
删除数据的方法如下:
1、通过linq查询ID是否存在
// 先通过ID查询到学生数据 Student student = (from tbRrmove in myModels.Student where tbRrmove.StudentID == studentID select tbRrmove).Single();
2、通过我们定义查询ID的变量来删除数据
完整代码:
/// <summary> /// 接收删除学生信息的ID /// </summary> /// <param name="studentID">接收删除学生信息的ID</param> /// <returns></returns> public ActionResult deletionStudent(int studentID) { var data = ""; // 先通过ID查询到学生数据 Student student = (from tbRrmove in myModels.Student where tbRrmove.StudentID == studentID select tbRrmove).Single(); // 删除数据 myModels.Student.Remove(student); if (myModels.SaveChanges() > 0) { data = "学生数据已删除"; } else { data = "学生数据删除失败"; } return Json(data,JsonRequestBehavior.AllowGet); }
通过回调函数添加页面刷新效果就完美解决了
总结:
获取数据库表内容:
1、通过linq查询全部字段,暂时学习三种
2、通过声明的变量放回值就好了
新增操作:
1、通过$.get()$.post()等提交方式将获取到的数据提交给控制器
2、控制器通过实例类接收方法,将获取到的方法add添加进数据库
3、必须的一点是,必须要有SaveChanges()
修改操作:
1、将修改之后的值传递给控制器
2、也是通过实例类来接收
3、一共有两种接收方法,一个不用引用类,一个要
4、Entry(传递值).State=EntityState.Modified要
删除操作:
1、先获取到要删除学生的ID
2、通过ID传递给控制器,同时要通过where查询ID是否存在
3、查询时出现三条波浪错误要添加Single()方法
4、删除是Remove(传递的ID)
注意:新增、修改、删除都要用到SaveChanges()