2011-11-03 56 views
1

我有2個DropDownList,像主從。 這是我的Default.aspx:通過jQuery.Ajax的返回值附加到DropDownList

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <table> 
      <tr> 
       <td> 
      <asp:Label ID="MsLbl" runat="server" Text="Groups" /> 
       </td> 
       <td> 
      <asp:DropDownList ID="Masterddl" runat="server"> 
        <asp:ListItem Text="G1" Value="G1" /> 
        <asp:ListItem Text="G2" Value="G2" /> 
        <asp:ListItem Text="G3" Value="G3" /> 
      </asp:DropDownList> 
       </td> 
      </tr> 
      <tr> 
       <td> 
      <asp:Label ID="Svlbl" runat="server" Text="Members" /> 
      </td> 
       <td> 
      <asp:DropDownList ID="Slaveddl" runat="server" /> 
      </td> 
      </tr> 
     </table> 
    </div> 
    </form> 
</body> 
</html> 

這是我的腳本:

$(document).ready(function() { 
$('select#Masterddl').change(function() { 
    MasterChangeHandler($(this).val()); 
}); 

function MasterChangeHandler(Value) { 
    $.ajax({ 
     type: 'Post', 
     url: 'MasterSlaveHandler.ashx', 
     dataType: "text", 
     data: 'ItemSelected=' + Value, 
     async: 'true', 
     success: function (data) { SuccessHandler1(data); } 

    }); 
} 


function SuccessHandler1(data) { 
    $('select#Slaveddl').empty(); 
    $.each(data, function (i, slaveValue) { 
     $('select#Slaveddl').append(
    $('<option></option>').val(slaveValue.Value).html(slaveValue.Text) 
    ); 
    }); 
} 

和我的處理程序:

public class SlaveValues { 
    public string Value { get; set; } 
    public string Text { get; set; } 
} 


public class MasterSlaveDropDownListsHandler : IHttpHandler { 
    public bool IsReusable { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) { 
     string valueSelected = context.Request["ItemSelected"]; 
     List<SlaveValues> slaveValues = new List<SlaveValues>(); 
     SlaveValues sv; 

     sv = new SlaveValues(); 
     sv.Text = "SV1"; 
     sv.Value = valueSelected + "s1"; 
     slaveValues.Add(sv); 

     sv = new SlaveValues(); 
     sv.Text = "SV2"; 
     sv.Value = valueSelected + "s2"; 
     slaveValues.Add(sv); 


     string responseText = 
    Newtonsoft.Json.JsonConvert.SerializeObject(slaveValues); 
     context.Response.ContentType = "text/json"; 
     context.Response.Write(responseText); 
    } 
} 

但並沒有什麼附加。 我也看到在Firebug窗口的響應如下(當我選擇從主DDL G2):

[{"Value":"G2s1","Text":"SV1"},{"Value":"G2s2","Text":"SV2"}] 

,最後我改變劇本我的成功方法與測試這個新:

function SuccessHandler2(data) { 
    $('select#Slaveddl').empty(); 
    $.each(data, function (i, slaveValue) { 
     $('select#Slaveddl').append(
    $('<option></option>').val('Member' + i).html('Member' + i) 
    ); 
    }); 
} 

當嘗試這個新的腳本綁定到奴隸ddl工作正常,但有一些額外的項目:索引顯示member0到member30,我不知道爲什麼。

EDIT1: 我也試試這個,正確追加:

function SuccessHandler3(data) { 
var values = [{ "Value": "G2s1", "Text": "SV1" }, { "Value": "G2s2", "Text": "SV2"}]; 
     $('select#Slaveddl').empty(); 
     $.each(values, function (i, slaveValue) { 
      $('select#Slaveddl').append(
$('<option></option>').val('Member' + slaveValue.Value).html('Member' + 
slaveValue.Text) 
     ); 
     }); 
    } 

所以我覺得有一個與操縱返回值(數據)的問題。

更具體的看法如下PIC是在Firebug窗口的JSON選項卡時,我選擇在主DDL G3:

JSON Tab in firebug

EDIT2:

我也試試這個,只是第一警報出現,顯然(data.d)爲空或不明物體:

function SuccessHandler6(data) { 
    var selection = $('select#Slaveddl'); 
    $(selection).children().remove(); 
    alert('in handler and remove children correctly'); 
    if (data.d) { 
     alert('data.d is not null'); 
     $(data.d).each(function (index, item) { 

$(selection).append('<option>').val(item.Value).html(item.Text); 
      alert('after append in index: ' + index); 
     }); 
    } 
} 

如何使用回報v alue正確並附加到Slave ddl?哪裏有問題?

回答

0

此鏈接將幫助你。你只需要獲取數據部分以顯示在你的從屬ddl中。若要僅獲取你需要得到data.d一部分.. 在這裏閱讀更多:Eval response.d in Jquery Ajax

這裏是一個小例子太多:

$.ajax({ 
     url: 'Users.aspx/GetUsers', 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify(postdata), 
     dataType: "json", 
     success: function(data, st) { 
      if (st == "success") { 
       var m = JSON.parse(data.d); 
       //you can run your loop here to add to ddl 
      } 
     }, 
     error: function() { 
      alert("Loading Failed!"); 
     } 
    }); 
+0

當我試圖解決方案中的螢火蟲顯示:JSON.parse:意外的字符 [中斷關於這個錯誤] var m = JSON.parse(data.d);並沒有工作。 – Saeid

1

ü應該嘗試像,我認爲。

檢查了這一點。

http://jsfiddle.net/rTua4/1/

var values = [{"Value":"G2s1","Text":"SV1"},{"Value":"G2s2","Text":"SV2"}]; 

    $.each(values , function (i, slaveValue) { 

     $('#xxx').append(
    $('<option></option>').val(slaveValue.Value).html('Member' + slaveValue.Text) 
     )}); 

你的下一個操作試試這個。

function SuccessHandler1(data) { 
    $('select#Slaveddl').empty(); 
    var m = JSON.parse(data); 
    $.each(m , function (i, slaveValue) { 
     $('select#Slaveddl').append(
    $('<option></option>').val(slaveValue.Value).html(slaveValue.Text) 
    ); 
}); 

}

+0

這是工作,接下來呢? – Saeid

+0

你下一步是什麼意思?你需要什麼 ? – erimerturk

+0

我需要附加返回值,但這只是一個定義的手動值,您定義的值是手動我需要實際返回值。 – Saeid

0

我想指出的是您正在試圖用HTTP處理程序來完成什麼通常使用Web服務,或者更準確地說是WCF RESTful Web服務來實現的。 WCF甚至可以爲你處理JSON的序列化。這裏有一個簡單的例子,您可以根據您的需求量身定製。 How do I return clean JSON from a WCF Service?

據我所知,HTTP處理程序用於處理文件類型(例如,您可以將處理程序與「.jpeg」文件類型關聯以動態返回「.jpeg」圖像)。

這是處理這個問題的「正確」方法。