基本思路:1.了解数据库中省和市的表结构及关联主键 2.创建html页面及select标签 3.通过ajax向ashx(一般处理程序)发送后台请求完成联动效果

表结构:

这里,开始创建一个命为demo.html的页面,并在页面中创建我们所需要的select标签

  <!--定义省select标签 start-->
<select id="pro"> </select>
<!--定义省select标签 end--> <!--定义市select标签 start-->
<select id="city"> </select>
<!--定义市select标签 end-->

引用jquery文件

 <script src="../Scripts/jquery-1.7.1.js"></script>

基础工作完成,在页面定义一个初始化省的js事件

<script type="text/javascript">
$(function () {
//初始化省的标签
initProviceSelect();
}); function initProviceSelect() { });
}
</script>

创建一个新的LoadAllProviceData.ashx,让前台向它发送请求

function initProviceSelect() {
//发送异步请求
//data返回的数据取决于后台的数据处理操作
$.get("LoadAllProviceData.ashx", "", function (data) {
$("#pro").html(data);//把这个标签内部的所有html替换成data
});
}

后台代码处理:

  context.Response.ContentType = "text/plain";
//拼接字符串
StringBuilder sb = new StringBuilder(); //这里偷个懒,用个古老的方式来演示=>使用强类型dataset获取省的所有数据
//实际这个强类型内部封装的都是ado.net的sql语法
//※强类型的DataSet有兴趣可以自己了解下,建议不用深入。因为现在有了强大的EF,这里纯粹是为了简单做个演示而使用它
//不了解这种写法没关系,你可以使用日常的查询或者自己写个简单的sqlHelper来进行数据操作
ProvinceTableAdapter adapter = new ProvinceTableAdapter();
ProvinceCityDataSet.ProvinceDataTable provinces = adapter.GetData();
foreach (var pro in provinces) //遍历行
{
sb.AppendFormat("<option value='{0}'>{1}</option>", pro.ProID, pro.ProName);
} context.Response.Write(sb.ToString());

开始浏览页面,就可以看到省的数据都被加载出来了。有没有觉得很easy?接下来开始实现通过选择省来捞出当前省对应下的市

在页面上绑定省的下拉列表的change事件

function bindProSelectChangeEvent() {
$("#pro").change(function(){ });
});
}

老样子,创建一般处理程序来发送异步请求到后台

先在前台页面定义请求事件

//绑定省的下拉列表的change事件
function bindProSelectChangeEvent() {
$("#pro").change(function(){
//拿到选中省的id(当前select标签的id)
var pId = $(this).val();
$.getJSON("LoadProviceCitiesByProID.ashx", { pId: pId }, function (data) {
$("#city").empty();
for (var key in data) {//通过key遍历数组,其实就是使用索引
var cId = data[key].CityId;
var cName = data[key].CityName;
//这里使用append之前注意下append是追加,所以为了防止把之前的数据要加进去,在之前先进清空
$("#city").append("<option value='"+cId+"'>"+cName+"</option>");
}
});
});
}

问题来了,假设我不使用$.getJSON或$.getAjax ,直接用$.get能行吗?

当然没问题,只是$.get返回的是一个string对象,需要再去手动给它转成json格式。这里顺便简单写下在这种情况下如何去做处理

把字符串处理成json对象的两种方式:

1.使用eval我想你应该很熟悉,这货可以直接把这个字符串当成一个js执行对象,但是这种不给力

var jsonData = eval(data); 

替换成下面这种,让它强制去执行, 这种处理方式兼容性会差些

var jsonData = eval("(" + data + ")");

2.使用jquery提供的一种处理方式

var jsonData = $.parseJSON(data);

好,看看浏览器调试结果,这样依然可以得到跟使用$.getJSON一样的效果了

后台处理,

第一种方式。自己拼接一个json格式返回前台,前台再遍历它读取

context.Response.ContentType = "text/plain";
//正常情况下不会为空,但如果直接请求ashx 这种情况就有可能为空了
//浏览器端不是受我们控制的,除非cs程序还有可能受我们控制
//所以不要相信客户端来的请求
int pId =int.Parse(context.Request["pId"] ?? ""); //根据省的id拿到所有的城市信息
CityTableAdapter adapter = new CityTableAdapter();
ProvinceCityDataSet.CityDataTable cityTable= adapter.GetProviceCityByProID(pId); //遍历城市信息,并且输出一个json格式字符串到前台
//两种方式
//1.自己拼接stringbuilder 最灵活的一种
StringBuilder sb = new StringBuilder();
sb.Append("[");//json 开始
foreach (var city in cityTable)
{
sb.Append("{");
sb.AppendFormat("\"CityId\":\"{0}\",\"CityName\":\"{1}\"",city.CityID,city.CityName);
sb.Append("},");//这个逗号代表为下一个创造一个条件
}
string response = sb.ToString().TrimEnd(',') + "]"; context.Response.Write(response);

第二种:后台输出json =>把一个集合自动转成json字符串

在后台一般处理程序定义一个内部类

public class CityData
{
public int CityID { get; set; }
public string CityName { get; set; }
}

把DataTable里的对象元素加到List<CityData>中,然后调用javascript序列化的类来转换json传到前台

//把一个集合自动转成json字符串
List<CityData> list = new List<CityData>();
foreach (var c in cityTable)
{
list.Add(new CityData
{
CityID=c.CityID,
CityName=c.CityName
});
}
//通过javascript序列化的类来进行转换
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
var response= js.Serialize(list);

这样我们简单的ajax异步省市联动就算完成了

html + ashx 实现Ajax省市联动的更多相关文章

  1. Ajax省市联动

    以JQuery为JS,写的Ajax省市联动. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  2. Json 基于jQuery+JSON的省市联动效果

    helloweba.com 作者:月光光 时间:2012-09-12 21:57 标签: jQuery  JSON  Ajax  省市联动     省市区联动下拉效果在WEB中应用非常广泛,尤其在一些 ...

  3. AJAX案例四:省市联动

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  4. AJAX应用案例之省市联动

    jsp 主要是要注意多Document的操作 <%-- Created by IntelliJ IDEA. User: YuWenHui Date: 2017/4/23 0023 Time: 1 ...

  5. ajax做省市联动

    原理: 当select.jsp页面打开时,向服务器发送异步请求,得到所有省份的名称(文本数据).然后使用每个省份名称创建<option>,添加到<select name=”provi ...

  6. 练习: 省市联动(Ajax)

    // 示例一: china.xml (位于 src 目录下) <?xml version="1.0" encoding="utf-8"?> < ...

  7. ajax经典案例--省市联动

    ajax的省市联动案例 如果我们的代码比较复杂,可以通过file_put_contents来输出信息到某个日志. 在一个元素中添加另一个元素使用的方法是:appendChild(). 函数append ...

  8. JS 省市联动 ajax

    省市联动 //省市联动     $('.locationCode').change(function () {         var val = $(this).val();         if ...

  9. Django(二十)下拉列表-省市联动实例:jquery的ajax处理前端

    一.知识点 1.jquery的ajax请求写法 <script src="/static/js/jquery-1.12.4.min.js"></script> ...

随机推荐

  1. wuzhicms刷新按钮的功能开发

    这个刷新按钮可以刷新当前框架的页面. 但有的页面使用了弹窗打开后,再点击刷新就会打开之前的弹窗页面. 如: 再刷新的时候,这个框架内容就变了.而这里,我们实际需要刷新的是列表页面 打开这个程序的具体文 ...

  2. Spark系列(一)Spark1.0.0源码编译及安装

    最近想对自己学的东西做些回顾,想到写博客是个不错的方式,方便他人也有利自己,刚开始写不足之处大家多担待. 编译前需要安装JDK1.6以上.scala.Maven.Ant.hadoop2.20 如下图( ...

  3. 常用apt cli

    常用的APT命令参数:  apt-cache search package 搜索包  apt-cache show package 获取包的相关信息,如说明.大小.版本等  sudo apt-get ...

  4. fckeditor的用法

    1.下载解压文件 2.将解压后的文件放入webroot下 3.将js引入要使用fckeditor的页面 4.用ckeditor替换textarea <@e.textarea id="t ...

  5. opencv数据结构-MAT结构详解

    1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...

  6. iOS_icon命名规范 (iPhone_retina屏幕开发)

    iOS_icon命名规范  (iPhone_retina屏幕开发) 规则: 位置名称_功能名称_ 详细区分标志名称@2x.png navigationItem_leftBackIcon@2x.png ...

  7. 【JAVA - SSM】之MyBatis查询缓存

    为了减轻数据压力,提高数据库的性能,我们往往会需要使用缓存.MyBatis为我们提供了一级缓存和二级缓存. (1)一级缓存是SqlSession级别的缓存,在操作数据库的时候需要创建一个SqlSess ...

  8. 如何停止IIS

    当一台计算机同时安装了IIS服务器和apache服务器的时候,需要运行其中的一个服务器就需要将另一个服务器停止,那么如何停止IIS服务器: 双击[world wide web publishing s ...

  9. C++ Combobox输入时自动完成

    Combobox 在输入时自动完成 关键点 实现过程 BOOL m_bAuto; BOOL CProject02Dlg::PreTranslateMessage(MSG* pMsg)  {     i ...

  10. [React] React Fundamentals: transferPropsTo

    the transferPropsTo method lets you easily push properties into your components to easily customize ...