试译《Ajax in Action》第四部分(七)

来源:互联网 发布:农村淘宝发展前景 编辑:程序博客网 时间:2024/05/22 00:16
 
9.5高级问题
     在这一章,我们构建了双组合脚本的一个简化版本。我们给服务器发送单个参数,并且为单个的选定项返回一组结果。你也许发现你需要改变程序的工作方式。你也许想向表单里添加另一个元素构成三组合。如果碰到这种情况,如何实现呢?下面的部分将给你提供想法。
9.5.1 允许多选查询
到目前为止,我们讨论的代码只是一个简单的示例,它只允许一个用户从每个选择列表里选择一个选项。在有的情况下,一个用户可能需要从第一个列表中选择不止一个选项。那意味着组合中第二个列表要填充与第一个列表中每一个选定项对应的值。通过对客户端和服务器端做一些简单的改变,我们可实现它。
     第一件要做的事是设置第一个选择列表,使它允许多选。要做到这一个点,我们需要在select标签中添加mutiple属性。为了指定显示多少选项,我们可以添加size属性。如果size小于选项数,选择列表将是可滚动的,以便显示那些看不见的选项。
<select name="ddlRegion" multiple size="4"
onchange="FillTerritory(this,document.Form1.ddlTerritory)">
 <option value="1">Eastern</option>
 <option value="2">Western</option>
<option value="3">Northern</option>
 <option value="4">Southern</option>
</select>
下一步是更改FillTerritory()函数。我们需要遍历所有选项,查找每个选定项的值,而不是仅仅引用select元素的选定索引。我们把每个选定项的值添加到参数字符串中:
function FillTerritory(oElem,oTarget){
 var url = 'DoubleComboMultiple.aspx';
 var strParams = "f=" + oTarget.form.name +
     "&e=" + oTarget.name;
 for(var i=0;i<oElem.options.length;i++){
    if(oElem.options[i].selected){
      strParams += "&q=" + oElem.options[i].value;
    }
 }
 
 var loader1 = new
net.ContentLoader(url,FillDropDown,null,"POST",strParams);
}
 
最后要做的一件事是更改服务器端脚本代码来处理请求中传递的多个值。
在.NET中,多个值用单个字符串表示,以逗号分隔。为了单独地获取每一个项,我们需要把字符串分离到一个数组中。然后,我们为SQL语句写WHERE从句来遍历这个数组。
 
Dim strQuery As String = Request.Form("q")
Dim strWhere As String = ""
Dim arrayStr() As String = strQuery.Split(",")
Dim i As Integer
For Each i In arrayStr
 If strWhere.Length > 0 Then
    strWhere = strWhere & " OR "
 End If
 strWhere = strWhere & " regionid = " & i
Next
Dim strSql As String = "SELECT " & _
           " TerritoryDescription, " & _
           " TerritoryID" & _
           " FROM Territories" & _
           " WHERE " & strWhere & _
           " ORDER BY TerritoryDescription"
 
通过这些改动,用户就可从第一个选择列表中选择多个地区,与每个选定区相应的范围将显示在第二个列表里。
 
9.5.2 双组合变身三组合
把一个双组合变为一个三组合只需少量改动,改动取决于我们如何处理服务器端的逻辑。第一个选 择是采取多个服务器端页面的逻辑,在每个页面里运行一个不同的查询。那将意味着为每个选择列表的onchange处理器添加另外的参数,以表示所调用的服务器端脚本的URL。
另一个选择很简单,在服务器端代码中添加if-else或switch-case语句。为了返回适当的值,if-else结构需要一个方法来决定哪个查询被执行。最简单的检查是基于要填充的select元素名称决定使用哪个SQL查询。所以,当我们正执行一个三组合时,我们可检查strElem变量的值。这种方法不需要我们对客户端代码中的onchange事件处理器作任何改动。
Dim strSql As String
If strElem = "ddlTerritory" Then
    strSql = "SELECT TerritoryDescription, " & _
             " TerritoryID" & _
             " FROM Territories" & _
             " WHERE " & strWhere & _
             " ORDER BY TerritoryDescription"
Else
    strSql = "SELECT Column1, Column2" & _
             " FROM TableName" & _
             " WHERE " & strWhere & _
             " ORDER BY Column2"
End If
采用这种方案,只要下拉列表有唯一的名称,在不需要把逻辑分离成不同的服务器端页面的情况下,你就能在页面上拥有多组合元素了。