上一节讲到jQuery,本来还不能这么快就发jQuery+Ajax的,因为这部分对于新手来说,不是很好理解,但为了配合发我的实习经验,就先贴出来了。新手先有个概念就好,Ajax是为了前端能和后台交互的,它们的关系就像:顾客来到某餐厅,服务员就像前台的一个元素,厨房就像后台的一个元素,你想吃什么和服务员说,服务员就让厨房里的人做出对应的佳肴,然后服务员拿着你想要的东西给你。(菜式名,钱等是传入参数,佳肴是返回数据~)
不扯了~我需要实现一种比较复杂的组合搜索效果。类似:
前端会记录所要搜索的关键词,每次新增一个条件,就请求后台一次返回符合要求的数据,同样,没删除一个条件,也会重新返回对应数据。
下面是我做的一个还有很多Bug的Demo,原本我想在后台保存结果数据,用了全局static变量来保存。
后来还是测试不出正确结果,觉得还是将数据在前端保存就好吧,然后每次都让后台根据前端的数据来返回新的数据。
前台:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ajaxJquery.aspx.cs" Inherits="EMS.WEB.Enterprise.ajaxJquery" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="js/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
var tabIds = new Array();
//下拉框选项改变时,列表选项判断后添加。Label1(相当图表)更新。
$("#mySelect").change(function () {
var selectId = $("#mySelect").val();
var selectText = $("#mySelect option:selected").text();
var isSecond = false;
for (var i = 0; i < tabIds.length; i++) {
if (tabIds[i] == selectId) {
isSecond = true;
return;
}
}
if (!isSecond) {
tabIds.push(selectId);
$("#myUi").append("<li " + "id='" + selectId + "'" + ">" + selectText + "</li>");
$.ajax({
type: "get",
url: "ajaxJquery.aspx",
data: "id=" + selectId + "&" + "show=1",
async: false,
contentType: "application/json;charset=utf-8",
dataType: "json",
success: function (msg) {
$("#Label1").text("");
$.each(msg, function () {
$("#Label1").text($("#Label1").text() + "+" + this.data);
});
}
});
}
});
//点击列表选项时,删除该选项,Label1(相当图表)更新。
$("#myUi li").live("click", function () {
var selectId = $(this).attr("id");
$(this).remove();
$.ajax({
type: "get",
url: "ajaxJquery.aspx",
dataType: "json",
async: false,
data: "id=" + selectId + "&" + "show=0",
success: function (msg) {
$("#Label1").text("");
$.each(msg, function () {
$("#Label1").text($("#Label1").text() + "+" + this.data);
for (var i = 0; i < tabIds.length; i++) {
if (tabIds[i] == selectId) {
tabIds.splice(i, 1);
return;
}
}
});
}
})
})
});
</script>
<style type="text/css">
#myUi li
{
background-color: Aqua;
margin-left: 4px;
float: left;
width: 70px;
list-style: none;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<select id="mySelect" runat="server">
</select>
</div>
<div id="myTab">
<ul id="myUi">
</ul>
</div>
<div style="clear: left;">
</div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<div id="ddiv" runat="server">
</div>
</form>
</body>
</html>
后台:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using System.Web.Script.Serialization;
using System.Text;
namespace EMS.WEB.Enterprise
{
[Serializable]//序列话后才能用系统类转换为json
public class Data
{
public int index;
public string data;
public Data(int i, string d)
{
index = i;
data = d;
}
}
public partial class ajaxJquery : System.Web.UI.Page
{
static List<Data> data= new List<Data>();//用来装 选择过的选项 的索引号及数据
public List<Data> ShowData(int id)
{
data.Add(new Data(id, "图:" + id));
return data;
}
public List<Data> RemoveData(int id)
{
for (int i = 0; i < data.Count; i++)
{
if (data[i].index == id)
{
data.Remove(data[i]);
break;
}
}
return data;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack && Request.Params["id"] == null)
{
#region 初始化数据
for (int i = 0; i < s.Length; i++)
{
mySelect.Items.Add(new ListItem(s[i], i.ToString()));
}
#endregion
return;
}
if (Request.Params["id"] != null)
{
int id = int.Parse(Request.Params["id"]);
JavaScriptSerializer json = new JavaScriptSerializer();
if (Request.Params["show"] == "1")
{
ShowData(id);
}
else if (Request.Params["show"] == "0")
{
RemoveData(id);
}
Response.Write(json.Serialize(data));
Response.End();
}
}
}
}