带jQuery和ASP.NET的级联下落列表

级联下拉列表或依赖下拉列为AJAX应用程序的签名菜肴。我花了很多少女而试图让一些工作,然后绊倒救命 jquery. plugin 这使得在客户端的下拉列表和微风一起使用。本文展示了如何运作,并利用我在我的WebService 以前的jQuery文章.

此练习的示例页面将呈现包含包含汽车选择的DropDownlis。一旦他们选择了他们的选择,第二个下拉将填充有适用于所选制作的可用型号。选择模型将填充该型号的可衔接颜色,以及当它们选择所需颜色时,将向用户呈现给用户的所有汽车的汽车细节。为此,在前一篇文章中的WebService已被扩展。我不仅将汽车对象添加到列表中<Car>,但我已经添加了一些额外的方法。以下是WebService的代码已满:

 

使用 System;

使用 System.Web;

使用 System.Web.Services;

使用 System.Web.Services.Protocols;

使用 system.web.script.services;

使用 system.collections.generic;

使用 System.Linq;

 

上市 班级

{

    上市 细绳 Make;

    上市 细绳 Model;

    上市 Year;

    上市 Doors;

    上市 细绳 Colour;

    上市 漂浮 Price;

    上市 Mileage;

}

 

 

/// <summary>

/// Carservice的简要描述

/// </summary>

[网络服务(命名空间= "http://tempuri.org/"

[网络服务Binding.(Conformsto =. Wsiprofiles..basicprofile1_1)]

 

[脚本service.]

上市 班级 车Service : 网络服务

{

 

    列表<> Cars = 新的 列表<>{

    新的 {make =.“奥迪”,模型="A4",年= 1995,门= 4,颜色=“红色的”,价格= 2995f,里程= 122458},

    新的 {make =.“福特”,模型="重点",年= 2002,DOORS = 5,COLOR =“黑色的”,价格= 3250f,里程= 68500},

    新的 {make =.“宝马”,模型=“5系”,年= 2006,DOORS = 4,COLOR =“灰色的”,价格= 24950f,里程= 19500},

    新的 {make =.“雷诺”,模型=“拉古纳”,年= 2000,DOORS = 5,COLOR =“红色的”,价格= 3995f,里程= 82600},

    新的 {make =.“丰田”,模型=“previa”,年= 1998,门= 5,颜色=“绿色的”,价格= 2695f,里程= 72400},

    新的 {make =.“小型的”,模型=“库珀”,年= 2005,DOORS = 2,颜色=“灰色的”,价格= 9850f,里程= 19800},

    新的 {make =.“马自达”,模型="MX 5",年= 2003,DOORS = 2,COLOR = “银”,价格= 6995f,里程= 51988},

    新的 {make =.“福特”,模型="嘉年华",年= 2004,门= 3,颜色=“红色的”,价格= 3759f,里程= 50000},

    新的 {make =.“本田”,模型=“符合”,年= 1997,DOORS = 4,COLOR =“银”,价格= 1995f,里程= 99750},

    新的 {make =.“奥迪”,模型="A6",年= 2005,门= 5,颜色=“银”,价格= 22995f,里程= 25400},

    新的 {make =.“捷豹”,模型=“XJS”,年= 1992,门= 4,颜色=“绿色的”,价格= 3450,里程= 92000},

    新的 {make =.“捷豹”,模型=“x键入”,年= 2006,DOORS = 4,COLOR =“灰色的”,价格= 9950f,里程= 17000},

    新的 {make =.“雷诺”,模型=“梅恩”,年= 2007,DOORS = 5,COLOR =“红色的”,价格= 8995f,里程= 8500},

    新的 {make =.“标致”,模型="406",年= 2003,门= 4,颜色=“灰色的”,价格= 3450F,里程= 86000},

    新的 {make =.“小型的”,模型=“Cooper S”,年= 2008,DOORS = 2,COLOR =“黑色的”,价格= 14850f,里程= 9500},

    新的 {make =.“马自达”,模型="5",年= 2006,门= 5,颜色=“银”,价格= 6940F,里程= 53500},

    新的 {make =.“vauxhall”,模型=“Vectra”,年= 2007,DOORS = 5,COLOR =“白色的”,价格= 13750F,里程= 31000},

    新的 {make =.“福特”,模型="彪马",年= 1998,DOORS = 3,COLOR =“银”,价格= 2995f,里程= 84500},

    新的 {make =.“福特”,模型=“K a”,年= 2004,门= 3,颜色=“红色的”,价格= 2995f,里程= 61000},

    新的 {make =.“福特”,模型="重点",年= 2007,DOORS = 5,COLOR =“蓝色的”,价格= 9950F,里程数= 19000},

    新的 {make =.“宝马”,模型=“3系”,年= 2001,DOORS = 4,颜色=“白色的”,价格= 5950f,里程= 98000},

    新的 {make =.“雪铁龙”,模型="C5",年= 2005,门= 5,颜色=“银”,价格= 5995f,里程= 38400},

    新的 {make =.“丰田”,模型=“花冠T3”,年= 2004,DOORS = 5,COLOR =“蓝色的”,价格= 5995f,里程= 71000},

    新的 {make =.“丰田”,模型=“雅丽斯”,年= 2005,DOORS = 3,颜色=“灰色的”,价格= 5350F,里程= 39000},

    新的 {make =.“保时捷”,模型="911",年= 2003,DOORS = 2,COLOR = “红色的”,价格= 16995f,里程= 88000},

    新的 {make =.“福特”,模型="嘉年华",年= 2004,门= 3,颜色=“红色的”,价格= 5759f,里程= 49000},

    新的 {make =.“本田”,模型=“符合”,年= 1996,DOORS = 4,COLOR =“黑色的”,价格= 1995f,里程= 105000},

    新的 {make =.“奥迪”,模型=“A3 Avant”,年= 2005,门= 5,颜色=“蓝色的”,价格= 12995f,里程= 22458},

    新的 {make =.“福特”,模型="蒙迪奥",年= 2007,DOORS = 5,COLOR =“金子”,价格= 12250f,里程= 8500},

    新的 {make =.“宝马”,模型=“1系”,年= 2006,DOORS = 4,COLOR =“黑色的”,价格= 16950f,里程= 19500},

    新的 {make =.“雷诺”,模型=“clio”,年= 2005,DOORS = 3,颜色=“红色的”,价格= 5995f,里程= 32600},

    新的 {make =.“丰田”,模型=“verso”,年= 2008,门= 5,颜色=“白色的”,价格= 12995f,里程= 5800},

    新的 {make =.“小型的”,模型=“库珀”,年= 2003,DOORS = 2,COLOR = “黑色的”,价格= 7950f,里程= 36800},

    新的 {make =.“马自达”,模型="6",年= 2007,门= 4,颜色=“蓝色的”,价格= 16995f,里程= 11300},

    新的 {make =.“福特”,模型="蒙迪奥",年= 2004,DOORS = 5,COLOR =“绿色的”,价格= 8759f,里程= 66000},

    新的 {make =.“本田”,模型=“公民”,年= 1997,DOORS = 4,COLOR =“灰色的”,价格= 1995f,里程= 99750},

    新的 {make =.“奥迪”,模型="Q7",年= 2005,门= 5,颜色=“黑色的”,价格= 22995f,里程= 25400},

    新的 {make =.“捷豹”,模型="XK8",年= 1992,门= 4,颜色=“蓝色的”,价格= 3450,里程= 92000},

    新的 {make =.“捷豹”,模型=“s型”,年= 2006,DOORS = 4,COLOR =“红色的”,价格= 9950f,里程= 17000},

    新的 {make =.“雷诺”,模型=“梅恩”,年= 2007,DOORS = 5,COLOR =“黄色的”,价格= 8995f,里程= 8500},

    新的 {make =.“标致”,模型="406",年= 2003,门= 4,颜色=“白色的”,价格= 3450F,里程= 86000},

    新的 {make =.“小型的”,模型=“库珀”,年= 2008,DOORS = 2,COLOR =“红色的”,价格= 14850f,里程= 9500},

    新的 {make =.“马自达”,模型="5",年= 2006,门= 5,颜色=“白色的”,价格= 6940F,里程= 53500},

    新的 {make =.“vauxhall”,模型=“Vectra”,年= 2007,DOORS = 5,COLOR =“蓝色的”,价格= 13750F,里程= 31000},

    新的 {make =.“福特”,模型="彪马",年= 1998,DOORS = 3,COLOR =“红色的”,价格= 2995f,里程= 84500},

    新的 {make =.“福特”,模型=“K a”,年= 2004,门= 3,颜色=“黑色的”,价格= 2995f,里程= 61000},

    新的 {make =.“福特”,模型="重点",年= 2007,DOORS = 5,COLOR =“灰色的”,价格= 9950F,里程数= 19000},

    新的 {make =.“宝马”,模型=“3系”,年= 2001,DOORS = 4,颜色=“红色的”,价格= 5950f,里程= 98000},

    新的 {make =.“雪铁龙”,模型="C5",年= 2005,门= 5,颜色=“黄色的”,价格= 5995f,里程= 38400},

    新的 {make =.“丰田”,模型=“花冠T3”,年= 2004,DOORS = 5,COLOR =“红色的”,价格= 5995f,里程= 71000},

    新的 {make =.“丰田”,模型=“雅丽斯”,年= 2005,DOORS = 3,颜色=“黑色的”,价格= 5350F,里程= 39000},

    新的 {make =.“保时捷”,模型="911",年= 2003,DOORS = 2,COLOR = “白色的”,价格= 16995f,里程= 88000},

    新的 {make =.“福特”,模型="嘉年华",年= 2004,门= 3,颜色=“灰色的”,价格= 5759f,里程= 49000},

    新的 {make =.“本田”,模型=“符合”,年= 1996,DOORS = 4,COLOR =“绿色的”,价格= 1995f,里程= 105000}

    };

 

    [WebMethod.]

    上市 列表<> GetCarsByDoors( doors)

    {

        var. 查询= c Cars

                    在哪里 c.Doors == doors

                    选择 c;

        返回 query.ToList();

    }

 

    [WebMethod.]

    上市 列表<> GetAllCars()

    {

        返回 Cars;

    }

 

    [WebMethod.]

    上市 列表<细绳> GetCarMakes()

    {

      var. 查询= ( c Cars

                  orderby. c.Make

                  选择 c.Make).Distinct();

      返回 query.ToList();

    }

 

 

    [WebMethod.]

    上市 列表<细绳> GetCarsByModel(细绳 make)

    {

      var. 查询= ( c Cars

                  在哪里 C.ke == make

                  orderby. c.Model

                  选择 c.Model).Distinct();

      返回 query.ToList();

    }

 

 

    [WebMethod.]

    上市 列表<细绳> GetCarsByColour(细绳 制作, 细绳 model)

    {

      var. 查询= ( c Cars

                  在哪里 c.make ==制作 && c.Model == model

                  orderby. c.Colour

                  选择 C.Colour).Distint();

      返回 query.ToList();

    }

 

 

    [WebMethod.]

    上市 列表<> GetCarListByColour(细绳 制作, 细绳 模型, 细绳 colour)

    {

      var. 查询= c Cars

                        在哪里 (c.Make == make &&

                        c.Model == model &&

                        c.Colour == colour)

                        选择 c;

      返回 query.ToList();

    }

}

 

其中三种附加方法返回列表类型<string>。这些用于填充下拉列表。最终方法检索列表<Car>符合使用DropdownLists选择的模型,制作和颜色标准。我说"DropDownLists",但实际上,ASPX文件中只有一个。另外两个是直接的HTML<select>元素。它通常是良好的做法,只能使用实际需要的ASP.NET服务器端控件。由于在客户端填充和引用第二个列表中的所有工作,因此我不需要将它们从代码背后引用。因此,没有必要具有runat ="server" controls.

 

<形式 ID=“form1” runat.="服务器">

<div>

 <div>

   <p>

    <标签>

     请选择:</标签><布尔 />

    <asp.:下拉列表 ID=“ddlmake” runat="服务器" />

   </p>

 </div>

 <div>

  <p>

    <标签>

     请选择模型:</标签><布尔 />

    <选择 ID=“ddlmodel”>

    </选择></p>

 </div>

 <div>

  <p>

    <标签>

     请选择颜色:</标签><布尔 />

    <选择 ID=“ddlcolour”>

    </选择></p>

 </div>

 <div ID=“输出”></div>

</div>

</形式>

 

服务器控件DropDownList将从Page_load上的代码填充:

 

保护 空白 Page_Load(目的 发件人, eventargs. e)

{

  如果 (!IsPostBack)

  {

    车Service 服务= 新的 车Service();

    列表<细绳>make = service.getcarmakes();

   ddlmake.datasource = make;

    ddlMake.DataBind();

   ddlmake.items.insert(0, “ - 选择make - ”);

  }

}

 

每当从代码后面填充dropdownlist并添加默认的第一个选项时,您应该始终确保页面尚未在此操作时发布。否则,每次都有回发时,将添加默认的第一个选项。使用AJAX加载此下拉列表并使其成为一个完美的<select>元素代替。但这只是为了它而使用Ajax,而不是因为有可识别的需求。

话虽如此,Ajax是这个例子是关于的,所以让我们进入客户端代码:

 

<脚本 SRC.=“script / jquery-1.2.6.min.js” 类型=“text / javascript”></脚本>

<脚本 SRC.=“script / jquery.selectboxes.min.js” 类型=“text / javascript”></脚本>

<脚本 类型=“text / javascript”>

  $(功能(){

    $('#ddlmake').change(getModels);

    $('#ddlmodel' ).attr('残疾', 真的);

    $('#ddlcolour').attr('残疾', 真的);

  });

 

引用了两个外部脚本文件:第一个是jQuery的浓缩版本,而第二个是用于管理下拉目或选择的插件。这是一些在页面的onload事件中运行的代码。它将事件处理程序应用于onchange事件"Make"调用GetModels()函数的列表,它还将第二个和第三选择设置为禁用。

在第一个列表中选择选项将触发GetModels()函数,如下所示:

 

功能 getModels() {

  $.ajax({

    type: “邮政”,

    url: "车Service.asmx/GetCarsByModel",

    data: “{制作: '” + $('#ddlmake').val()+ “'}”,

    contentType: “application / json; charset = utf-8”,

    dataType: “json”,

    success: 功能(回复) {

      var. models = (类型 response.d)== '细绳' ? eval('(' + response.d + ')'):响应。

      $('#ddlmodel' ).attr('残疾', 错误的).change(getColours).removeOption(/./)。addOption('', ' - 选择型号 - ');

      $('#ddlcolour').attr('残疾', 真的).RemoveOption(/./);

 

      为了 (var. i = 0; i <模型.Length; I ++){

        var. val = models[i];

        var. text = models[i];

        $('#ddlmodel' ).addoption(val,文本, 错误的);

      }

    }

  });

}

 

这个Ajax呼叫遵循一个非常相似的模式 在我以前的文章中介绍的那些。它调用了一个名为getCarsBymodel的WebMethod,Make作为参数传递。一旦收到并验证了响应,就会发生一些事情。启用了模型选择列表,jQuery链接用于首先禁用颜色下拉(如前所述启用,然后添加onchange事件处理程序,该命令触发GetColours()函数。接下来将清除下拉列表使用selectboxes插件的removeOption()函数,最后将默认选项添加到DropdownList中。所有这一行都在一行。

然后将颜色下拉列表处理为链接的命令,然后清除任何先前选项。最后,响应被迭代并添加到模型下拉列表中的选项元素。与WebMethods在上一篇文章中提供的响应相反,此响应是一个名为 d 其单个属性只包含一个字符串数组。例如,如果从制作下拉列表中选择了Ford,则响应如下:

 

{"d":["Fiesta","Focus","Ka","Mondeo","Puma"]}

 

选择其中一个模型将导致onchange事件处理程序启动,调用getColours()函数:

 

功能 getColours() {

  $.ajax({

    type: “邮政”,

    url: "车Service.asmx/GetCarsByColour",

    data: “{制作: '” + $('#ddlmake').val()+ “', 模型: '” + $('#ddlmodel' ).val()+ “'}”,

    contentType: “application / json; charset = utf-8”,

    dataType: “json”,

    success: 功能(回复) {

      var. colours = (类型 response.d)== '细绳' ? eval('(' + response.d + ')'):响应。

      $('#ddlcolour').attr('残疾', 错误的).change(getcarlistbycolour).removeoption(/./)。addOption('', ' - 选择color - ');

     

      for (var. i = 0; i <Colours.Length; I ++){

        var. val = colours[i];

        var. text = colours[i];

        $('#ddlcolour').addoption(val,文本, 错误的);

      }

    }

  });

}

 

在此功能中将两个参数传递给对网站方法的调用,这些是制作下拉所选值和模型下拉所选值。除了其余的代码应该熟悉先前的函数。请注意jQuery链接用于启用颜色下拉,添加onchange事件处理程序,清除它,最后设置默认选项。 onchange事件处理程序调用最终函数,这导致从Web服务中检索的汽车集合,然后在页面上的最终DIV中显示:

 

功能 getcarlistbycolour(){

  $.ajax({

    type: “邮政”,

    url: "车Service.asmx/GetCarListByColour",

    data: “{制作: '” + $('#ddlmake').val()+ “',” +

          “模型: '” + $('#ddlmodel' ).val()+ “',” +

          “颜色: '” + $('#ddlcolour').val()+ “'}”,

    contentType: “application / json; charset = utf-8”,

    dataType: “json”,

   成功:功能(响应){

      var. cars = (类型 response.d)== '细绳' ? eval('(' + response.d + ')'):响应。

      $('#输出')。空的();

      为了 (var. i = 0; i < cars.length; i++) {

        $('#输出')。附加('<p><strong>' +汽车[i]。发动机+ '' +

                              cars[i].Model + '</strong><br /> Year: ' +

                              cars[i].Year + '<br />Doors: ' +

                              cars[i].Doors + '<br />Colour: ' +

                              cars[i].Colour + '<br />Mileage: ' +

                              cars[i].Mileage + '<br />Price: £' +

                              cars[i].Price + '</p>');

      }

    }

  });

}     

</脚本>

 

如果您阅读了上一篇关于打电话的Web服务Wtih jQuery的文章,那么这里没有什么是新的。该脚本只需调用getCarlistByColoup()WebMethod并将一个对象数组返回为JSON字符串。返回的汽车是匹配在下拉列表中选择的制作,模型和颜色的汽车,结果将写入页面底部的DIV。

使用jQuery自己的此任务将需要更多的工作,但是挖掘可用于jQuery的插件主机急剧上升。