当前所做的项目,关于数据库设计的时候有点小意思,表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. java System类的一些静态方法

    package cn.sasa.demo2; public class SystemDemo { public static void main(String[] args) { func_array ...

  2. 洛谷P4358密钥破解 [CQOI2016] 数论

    正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...

  3. python 去除微软的BOM

    傻逼微软会给文件前面加上efbbbf, 导致开发人员浪费很多时间在排错上,下面通过python代码来实现去除微软BOM的功能 用法很简单,指定可能含有BOM开头的文件,并且将微软的\r\n 换成lin ...

  4. fiddler 实现代理的操作

  5. oracle中nvarchar2()和varchar2()的区别

    1.NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符. 2.而VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个.

  6. caz,数字证书,公钥

    如何有效检查证书有效性? https://www.jianshu.com/p/f4a37da10c53 自签名的https证书是不安全的 https://www.cnblogs.com/liyy201 ...

  7. (4.22)Microsoft 管理控制台启用 SSL 加密的 SQL Server 实例

    如何通过使用 Microsoft 管理控制台启用 SSL 加密的 SQL Server 实例 关键词:MSSQL加密,sql server加密,sql server客户端与服务器传输内容加密 转自:h ...

  8. Python3学习之路~6.4 析构函数

    析构函数是在实例释放.销毁的时候执行的,通常用于做一些收尾工作.比如说,关闭一些数据库连接.打开的临时文件等. #Author:Zheng Na class Role: # 构造函数 def __in ...

  9. python的第三方库

    python的第三方库 https://www.lfd.uci.edu/~gohlke/pythonlibs/

  10. 006-优化web请求二-应用缓存、异步调用【Future、ListenableFuture、CompletableFuture】、ETag、WebSocket【SockJS、Stomp】

    四.应用缓存 使用spring应用缓存.使用方式:使用@EnableCache注解激活Spring的缓存功能,需要创建一个CacheManager来处理缓存.如使用一个内存缓存示例 package c ...