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 ...
随机推荐
- django--验证码功能实现
首先建立验证码的视图函数1需要安装pillow库 #导入绘图库 from PIL import ImageDraw #导入绘图字体库 from PIL import ImageFont #导入图片库 ...
- 防止atoi函数内存越界
函数形式为: int atoi(const char *nptr); 函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非 ...
- nginx 负载均衡5种配置方式
nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...
- Log4j Append属性指定是否追加内容
Log4j默认是不断的把日志内容追加到日志文件: 这里就有个属性 Append 默认就是true: 假如我们设置成false 就不追加了 直接覆盖前面的内容: 我们来测试下: log4j.rootLo ...
- 5分钟简述Spring中的DI与AOP
Spring的两个核心特性: 依赖注入(dependency injection,DI) 面向切面编程(aspect oriented programming,AOP) 依赖注入(dependency ...
- MySQL忘记root密码--不重启mysqd重置root密码
先提个问题:如何不重启mysqld,且没有权限修改用户账号和权限的情况下,如何重新设置root密码?不知道没关系,在此之前我也是不知道如何操作的,先看看下面的几种重置root密码的方法. 1.skip ...
- 初学git
初学git,总结了一点东西,可能有理解和操作的不到位的地方,还有就是这个是我之前写在word上的,因为CSDN上不能直接上传,所以拷贝的过程中也可能有其他问题.发的的朋友还望指正... 1.找到“参与 ...
- Scala数据类型的继承结构
Scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any.统一类型,是Scala的又一大特点.更特别的是,Scala中还定义了几个底层类(Bottom Class) ...
- HTTP协议和WEB框架
一.HTTP协议 <<HTTP权威指南>>读书笔记:https://www.cnblogs.com/qcssmd/p/5508150.html 一.HTTP简介 HTTP协议是 ...
- maven install安装工程
在一个项目中,想要运行一个子工程,要先把它的依赖工程导入到maven中. 右键依赖工程--run as--maven install.