我有2个DropDownList,就像Master-Slave一样。 这是我的Default.aspx:
<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窗口中看到响应如下(当我从Master 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)
);
});
}
当尝试这个新脚本时,对Slave 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)
);
});
}
所以我认为操纵返回值(数据)存在问题。
对于更具体的视图,当我在Master ddl中选择G3时,以下图片是firebug窗口中的JSON选项卡:
EDIT2:
另外我尝试这个,只出现第一个警告,显然(data.d)是null或未知对象:
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);
});
}
}
如何正确使用返回值并附加到Slave ddl?问题出在哪里?
答案 0 :(得分: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)
);
});
}
答案 1 :(得分:1)
这可能非常有用,就像你的问题一样,有一个完整的逐步解决方案:
答案 2 :(得分:0)
此链接可以帮助您。您只需要获取要在slave 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!");
}
});
答案 3 :(得分:0)
我想指出,您尝试使用HTTP处理程序完成的任务通常是使用Web服务完成的,或者更准确地说是使用WCF RESTful Web服务完成的。 WCF甚至为您处理JSON的序列化。这是一个简化的例子,您可以根据自己的需要进行定制。 How do I return clean JSON from a WCF Service?
据我所知,HTTP处理程序用于处理文件类型(例如,您可以将处理程序与“.jpeg”文件类型相关联,以动态返回“.jpeg”图像)。
这是解决这个问题的“正确”方法。