当前所做的项目,关于数据库设计的时候有点小意思,表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. 【python基础】迭代器和生成器函数

    1.迭代器协议: 1.迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退) ...

  2. JVM java垃圾回收机制

    一.jvm简介 1.JVM内存运行时数据区的三个重要的地方 1.1.堆(heap):它是最大的一块区域,用于存放对象实例数组,是全局共享的. 1.2.栈(stack):全称为虚拟机栈,主要存储基本数据 ...

  3. java的错题整理

    为了阅读方便,我们写代码时要缩进,以便于更好的理解代码 对象是是具有相同属性和共同行为的一组类的实例,不是集合. B是标准格式,D没有对象接收它,所以这样子. boolean的默认值是false如果一 ...

  4. IDEA集成的 Thrift 插件进行 thrift 编译

    IDEA集成的 Thrift 插件进行 thrift 编译 注意 1.thrift文件要放在source目录,才有compile选项 2.generator list的output path不用加包名 ...

  5. centos下搭建sockets5代理

    #安装依赖及ss5 yum -y install gcc openldap-devel pam-devel openssl-devel wget https://nchc.dl.sourceforge ...

  6. 0703-spring cloud config-git配置属性加解密之对称加密

    一.概述 可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密.要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Securi ...

  7. bcolz的新操作

    1.直接修改 eg:把data.bcolz文件中A列为0的数据填充为1000. data = bcolz.open("data.bcolz", "a") #以& ...

  8. su - 和su的区别

    su root和su - root: su只是切换了root身份,但Shell环境仍然是普通用户的Shell:而su -连用户和Shell环境一起切换成root身份了 推荐使用su - .

  9. Openvpn配置文件详解

    一.vars配置文件 vars配置文件的主要内容如下: cat vars |grep -vE "^#|^$" KEY_DIR定义key生成的目录. KEY_SIZE定义生成私钥的大 ...

  10. java中Long的比较

    Long的比较要用equals而不要用== 当Long为常量且常量值小于一个字节(<=127)时,两个Long指向同一个常量内容: Long userId=127L; Long authorId ...