当前所做的项目,关于数据库设计的时候有点小意思,表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 下拉列表三级联动的更多相关文章

  1. (八)学习MVC之三级联动

    1.新建项目,MVC选择基本模板 2.新建类:Model/Student.cs,数据库信息有三个实体:分别是年级.班级和学生. using System; using System.Collectio ...

  2. JAVA EE 中之AJAX 无刷新地区下拉列表三级联动

    JSP页面 <html> <head> <meta http-equiv="Content-Type" content="text/html ...

  3. easyUI下拉列表三级联动

    首先是先想好数据库的搭建,通过地区id,地区名称,上级地区id就可以实现,所有省市区的数据 例如: DAO层 service层 Servlet 页面 <!DOCTYPE html> < ...

  4. Ajax省市地区下拉列表三级联动

    SQL数据库表 --创建Province表 CREATE TABLE [dbo].[Province]( [Id] [int] NULL, [Name] [varchar](50) NULL, [or ...

  5. mvc关于三级联动修改时数据回显

    在网上找了好久,都没有找到自己想要的那种效果,最后还是自己写出来了, 虽然方法有点笨. 这是Controller里 public ActionResult Edit(string id) { //查询 ...

  6. Android实现三级联动下拉框 下拉列表spinner

    Android实现(省.市.县)三级联动下拉框 下拉列表spinner 转载请注明出处: http://www.goteny.com/articles/2013/11/46.html http://w ...

  7. Java下使用Apache POI生成具有三级联动下拉列表的Excel文档

    使用Apache POI生成具有三级联动下拉列表的Excel文档: 具体效果图与代码如下文. 先上效果图: 开始贴代码,代码中部分测试数据不影响功能. 第一部分(核心业务处理): 此部分包含几个方面: ...

  8. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  9. Easyui表单之下拉列表的三级联动

    一.实现三级联动需要连接数据库 二.需要JSON数据的解析 三.需要Servlet类与界面相对应值的传递 1. 界面层需要的代码如下: <!DOCTYPE html> <html&g ...

随机推荐

  1. jquery键盘事件

    场景:当我们遇到onclick按钮事件时需要按回车执行时就用到了键盘监听事件 例如:<button id="sign_in_button" class="btn b ...

  2. eclipse怎么解决Failed to load the JNIshared library

    Q: 打开eclipse打开报Failed to load the JNIshared library的错误. A:jdk的位数跟eclipse位数一致即可解决. 把eclipse下载64位即可 cm ...

  3. 洛谷P3121 审查(黄金)Censoring(Gold) [USACO15FEB] AC自动机

    正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC ...

  4. 【python基础】常用的内置函数

    python基础之内置函数 参考: http://www.runoob.com/python/python-built-in-functions.html -zip() zip函数接受任意多个(包括0 ...

  5. 文件批量scp分发脚本

    #!/bin/bash SERVERS="172.17.xx.y 172.17.pp.mm" PASSWORD=机器登录密码 auto_ssh_copy_file() { expe ...

  6. 在asp.net中使用瀑布流,无限加载

    页面中代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...

  7. 六、SpringBoot与数据访问

    六.SpringBoot与数据访问 1.JDBC spring: datasource: username: root password: 123456 url: jdbc:mysql://192.1 ...

  8. linux 查看磁盘读写:iotop

    iotop命令用来动态地查看磁盘IO情况,用法如下: 安装iotop命令 [root@mysql ~]# yum install iotop -y [root@mysql ~]# iotop Tota ...

  9. git出现warning: LF will be replaced by CRLF的解决方法

    今天ytkah用git上传文件的时候出现了warning: LF will be replaced by CRLF的错误,具体信息如下,这是因为跨平台开发下产生的.由于编辑器的不同或者Windows程 ...

  10. wordpress去掉category怎么操作让url更简洁友好

    用wordpress建站是比较流行的,全球将近25%的站点是用wordpress搭建的.有很多的模板.插件可以选择,当然最好还是能自己优化.URL固定链接就是之中一个基础的技巧.有网友问如何去掉url ...