MVC 下拉列表三级联动
当前所做的项目,关于数据库设计的时候有点小意思,表A是三个联合主键,key1,key2,key3,表B是四个联合主键 key1,key2,key3,key4,其中表B的联合外键关联表A对应的联合主键,其实这种情况是很多的,比如常见的 省、市、区 三级菜单。这样一来,对表B做新增的时候 就需要几个小步骤:
①:界面初始化,返回下拉列表 key1(distinct)、key2(只赋值初始值)、key3(只赋值初始值)
②:界面勾选key1,触发chang事件,采用getJson 方式将参数key1的值发送到Action中 ,同时设置下拉列表b 的内容为空,$("#b").html('');
控制器做处理后,返回 key2的集合
③:界面的回调函数中,给下拉列表b 用append 的方式加入 value 值 和 文本值
④:界面勾选key2,触发change事件,采用getJson 方式将参数key1、key2 的值发送到Action中,同样设置下拉列表c的内容为空,$("#c").html('');
控制器做处理后,返回key3的集合
⑤:界面回调函数中,给下拉列表c 用append的方式加入 value 值 和文本值
⑥:判断key4 是否在表B中存在,不存在,插入数据,返回提示
从着手项目以来,最开始总想用代码来说明,虽然最后是实现了功能,但回过头看起来,简直是惨不忍睹,实在是有删除从写的冲动,越来越久,才发现,先考虑清楚逻辑,就是深度思考是第一步,虽然说起来很容易,往往实践起来很难
--主表TMain 从表TMinor
use TestBook
alter table TMinor
add constraint Tminor_fk foreign key(Key1,Key2,Key3) references TMain(Key1,Key2,Key3)
第一步: 将三级联动的下拉列表封装到一个类中
public class TMainResult
{
/// <summary>
/// 一级下拉框
/// </summary>
public string Key1 { get; set; } /// <summary>
/// 二级下拉框
/// </summary>
public string Key2 { get; set; } /// <summary>
/// 三级下拉框
/// </summary>
public string Key3 { get; set; }
}
第二步:在控制器中设置列表值,并在前台展示
public ActionResult Index()
{
//绑定Key1 //GetKey1() 得到表中 key1栏位集合
ViewBag.List_Key1 = new SelectList(dbhelper.GetKey1.ToList(), "Key1", "Key1").AsEnumerable();
//Key2、Key3 赋空值
List<ThreeDrop> selectlist = new List<ThreeDrop>();
ViewBag.List_Key2 = new SelectList(selectlist, "Key2", "Key2").AsEnumerable();
ViewBag.List_Key3 = new SelectList(selectlist, "Key3", "Key3").AsEnumerable();
return View();
}
<div>
@using (Html.BeginForm("Index"))
{
<label>一级菜单(省份)</label>
@Html.DropDownList("Key1", ViewBag.List_Key1 as IEnumerable<SelectListItem>,'请选择')
<p></p>
<label>二级菜单(地级市)</label>
@Html.DropDownList("Key2",ViewBag.List_Key2 as IEnumerable<SelectListItem>,'请选择')
<p></p>
<label>三级菜单(区、县)</label>
@Html.DropDownListFor(m=>m.Key3,ViewBag.List_Key3 as IEnumerable<SelectListItem>,'请选择')
}
</div>
第三步: 后台写好返回的数据
//實現二級連動
public JsonResult GetKey2Bykey1(string key1)
{
List<ThreeDrop> ConfigTypelist = dbhelper.GetKey2(key1).ToList();
return Json(ConfigTypelist, JsonRequestBehavior.AllowGet);
} //實現三級聯動
public JsonResult GetKey3Bykey2(string key1, string key2)
{
List<ThreeDrop> ConfigMSTlist = dbhelper.GetKey3(key1, key2).ToList();
return Json(ConfigMSTlist, JsonRequestBehavior.AllowGet);
}
第四步: 前台发送Ajax请求,并解析后台返回的数据
<script>
$(function () {
//一级联动
$("#Key1").change(function () {
var url = "/Test/GetKey2/?Key1=" + $("#Key1").val() + "";
$.getJSON(url, function (data) {
$("#Key2").html('');
$("#Key2").append("<option value=''>请选择</option>");
$.each(data, function (i,item) {
$("#Key2").append("<option value='"+item.Key2+"'>"+item.Key2+"</option>");
})
});
})
//二级联动
$("#Key2").change(function () {
var url = "/Text/GetKey3/?Key1="+$("#Key1").val()+"&&Key2="+$("#Key2").val()+"";
$.getJSON(url, function (data) {
$("#Key3").html('');
$("#Key3").append("<option value=''>请选择</option>");
$.each(data, function () {
$("#Key3").append("<option value='"+$("#Key3")+"'>'"+$("#Key3")+"'</option>");
}) })
}) })
</script>
这样以来,我们前台就只需要判断,key1 和key2 的value值不能为空 就可以得到一组正确三级数据值,那么在后台接收的时候,就通过封装一个新增 model实体类 直接传值到后台进行处理,至于先判断Key4是否在B表中是否有重复值,这就是不是重点了,总之大致思路就是这样。
为什么第一次加载界面的二三级下拉列表值为空?
因为联动是 触发change() 事件,只有鼠标点选了下拉列表才会触发,如果上来二三级下拉列表也绑定,那么点选一后,二自动变换,此时再去点选三,就不是二联动过去
MVC 下拉列表三级联动的更多相关文章
- (八)学习MVC之三级联动
1.新建项目,MVC选择基本模板 2.新建类:Model/Student.cs,数据库信息有三个实体:分别是年级.班级和学生. using System; using System.Collectio ...
- JAVA EE 中之AJAX 无刷新地区下拉列表三级联动
JSP页面 <html> <head> <meta http-equiv="Content-Type" content="text/html ...
- easyUI下拉列表三级联动
首先是先想好数据库的搭建,通过地区id,地区名称,上级地区id就可以实现,所有省市区的数据 例如: DAO层 service层 Servlet 页面 <!DOCTYPE html> < ...
- Ajax省市地区下拉列表三级联动
SQL数据库表 --创建Province表 CREATE TABLE [dbo].[Province]( [Id] [int] NULL, [Name] [varchar](50) NULL, [or ...
- mvc关于三级联动修改时数据回显
在网上找了好久,都没有找到自己想要的那种效果,最后还是自己写出来了, 虽然方法有点笨. 这是Controller里 public ActionResult Edit(string id) { //查询 ...
- Android实现三级联动下拉框 下拉列表spinner
Android实现(省.市.县)三级联动下拉框 下拉列表spinner 转载请注明出处: http://www.goteny.com/articles/2013/11/46.html http://w ...
- Java下使用Apache POI生成具有三级联动下拉列表的Excel文档
使用Apache POI生成具有三级联动下拉列表的Excel文档: 具体效果图与代码如下文. 先上效果图: 开始贴代码,代码中部分测试数据不影响功能. 第一部分(核心业务处理): 此部分包含几个方面: ...
- MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动
MVC图片上传详解 MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...
- Easyui表单之下拉列表的三级联动
一.实现三级联动需要连接数据库 二.需要JSON数据的解析 三.需要Servlet类与界面相对应值的传递 1. 界面层需要的代码如下: <!DOCTYPE html> <html&g ...
随机推荐
- linux查找大文件命令
测试服务器用久了,如果没有运行自动清除日志的脚本,会导致硬盘空间不足,应用.数据库.环境等启动不了: 如果你对系统不是特别熟悉,就无法知道那些占用空间的日志或缓存文件在哪里,这时,我们就可以利用查找大 ...
- Docker For Mac没有docker0网桥
在使用Docker时,要注意平台之间实现的差异性,如Docker For Mac的实现和标准Docker规范有区别,Docker For Mac的Docker Daemon是运行于虚拟机(xhyve) ...
- 【SQL】SQL Between用法
- head 命令 读取文件的前n行,默认查看文件的前十行
head 命令 读取文件的前n行 默认查看文件的前十行 head /etc/passwd # 默认查看文件的前十行 /etc/passwd # 查看文件的前两行
- php魔术变量和13个PHP魔术函数
PHP魔术变量确切地说是PHP魔术常量,不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了.比如说__LINE__放在不同的地方是显示不 ...
- 结合python+selenium使用AutoIt V3实现文件、图片上传
1.下载.安装AutoIt V3 下载官网:https://www.autoitscript.com/site/autoit/downloads/ 2.AutoIt V3组件介绍 AutoIt Win ...
- cxf简单例子
cxf 这里介绍在web跟非web中的发布以及调用 准备条件: 1,导入cxf的相关jar包,以maven项目为例 pom的配置文件为 <project xmlns="http://m ...
- vue-3.0创建项目
.npm install --global @vue/cli .npm install -g @vue/cli-init .vue init webpack my-project
- np.newaxis学习【转载】
转自:https://blog.csdn.net/lanchunhui/article/details/49725065 1.相当于None >> type(np.newaxis) Non ...
- 【EatBook】-NO.1.EatBook.1.JavaData.1.001-《JSON 必知必会-Introduction to JavaScript Object Notation》-
1.0.0 Summary Tittle:[EatBook]-NO.1.EatBook.1.JavaData.1.001-<JSON 必知必会-Introduction to JavaScrip ...