基本思路: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. POJ-1151 Atlantis 矩形面积并

    题目链接:http://poj.org/problem?id=1151 扫描线+离散+线段树,线段树每个节点保存的是离散后节点右边的线段. //STATUS:C++_AC_16MS_208KB #in ...

  2. HDU4737 - A Bit Fun(线段树)

    题目大意 给你一个数组a,定义f(i,j)=ai|ai+1|ai+2|⋯|aj ,|为or运算,求满足f(i,j)<m的二元组个数,N≤105,m≤230 题解 枚举起点i,然后找出最靠右的k, ...

  3. [delphi技术]Delphi常见图象格式转换技术

    TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf ...

  4. 从bug中学习怎么写代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:从bug中学习怎么写代码.

  5. @ContextConfiguration注解说明

    @ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件单个文件 @ContextConfiguration(Locations="../ap ...

  6. html页面一段时间自动跳转

    一.JS    <script> var flag = true; document.onmousemove = new Function("flag = false;" ...

  7. AMQP与QPID简介

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. vs自带服务测试工具

    在vs安装目录有一个vs自带的服务测试工具,地址为: "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Wcf ...

  9. [Webpack 2] Optimize React size and performance with Webpack production plugins

    You can fine tune several webpack plugins to make your bundle as small as it can be for your specifi ...

  10. [Javascript] Get Started with LeafletJS Mapping

    Leaflet makes creating maps in the browser dead simple. With some HTML and 3 lines of JavaScript, we ...