这是我的Default.aspx + jQuery脚本:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org
/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="Sample001.Default" %>
<script src="jquery-1.6.4.min.js" type="text/javascript"></script>
<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="masterlbl" Text="Master" runat="server" />
</td>
<td>
<span class="Mastercs">
<asp:DropDownList ID="ddl1" runat="server">
<asp:ListItem Text="Item1" Value="Item1" />
<asp:ListItem Text="Item2" Value="Item2" />
<asp:ListItem Text="Item3" Value="Item3" />
<asp:ListItem Text="Item4" Value="Item4" />
<asp:ListItem Text="Item5" Value="Item5" />
</asp:DropDownList>
</span>
</td>
<td>
<asp:Label ID="slavelbl" Text="Slave" runat="server" />
</td>
<td>
<span class="slavecs">
<asp:DropDownList ID="ddl2" runat="server" />
</span>
</td>
</tr>
</table>
</div>
</form>
<script type="text/javascript">
$(document).ready(function () {
$('span.Mastercs select').change(function () {
$.ajax({
type: "POST",
url: 'MyHandler.ashx',
dataType: "text",
data: "ItemSelected=" + $('select#ddl1').val(),
async: true,
success: function (data) { Handler_Success(data); }
});
});
function Handler_Success(data) {
$('select#ddl2').empty();
$.each(data, function (i, slaveValue) {
$('select#ddl2').append($('<option></option>')
.val(data.Value).html(data.Text));
});
}
});
</script>
</body>
</html>
上面的代码正常工作。 但我需要再传递一个参数,并且存在问题。 我尝试This Way以及以下代码,但检索空值:
$.ajax({
type: "POST",
url: 'MyHandler.ashx',
dataType: "text",
data: '{"ItemSelected=" ' + $('select#ddl1').val() + ', "ID="' +
$('select#ddl1').attr('id') + ' }',
async: true,
success: function (data) { Handler_Success(data); }
});
});
问题出在哪里?
编辑:
我还需要使用HttpHandler而不是WebService或WebMethod
这是我的HttpHandler:
public class SlaveValue {
public string Value { get; set; }
public string Text { get; set; }
}
public class SlaveValueHandler : IHttpHandler {
public bool IsReusable {
get { return true; }
}
public void ProcessRequest(HttpContext context) {
string valueSelected = context.Request["ItemSelected"];
string id = context.Request["ID"];
List<SlaveValue> slaveValues = new List<SlaveValue>();
SlaveValue sv;
sv = new SlaveValue();
sv.Text = "SV1";
sv.Value = valueSelected + id + "s1";
slaveValues.Add(sv);
string responseText = Newtonsoft.Json.JsonConvert.SerializeObject(slaveValues);
context.Response.ContentType = "text/json";
context.Response.Write(responseText);
}
}
和我的WebConfig:
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="Slave Handler" verb="*" path="MyHandler.ashx"
type="Sample001.SlaveValueHandler,Sample001" preCondition="integratedMode" />
</handlers>
</system.webServer>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
</configuration>
编辑:
我在这里找到它: CodeProject
答案 0 :(得分:2)
如果你打算以文本格式传递数据,你可能只有一个参数 - 毕竟,.NET如何知道第一个参数的结束位置和第二个参数的开始位置?
相反,尝试以JSON格式传递数据,并将data参数设置为使用JSON格式。
$.ajax({
type: "POST",
url: 'MyHandler.ashx',
dataType: "application/json",
data: '{"ItemSelected":"' + $('select#ddl1').val() + '", "ID":"' +
$('select#ddl1').attr('id') + '" }',
async: true,
success: function (data) { Handler_Success(data); }
});
});
但是,对于像您这样的HTTP处理程序,这可能不起作用。通常,您希望在Web服务(.asmx)文件中执行此操作,并定义Web方法来执行此操作。
有关详情,请参阅Dave Ward的网站http://www.encosia.com。 This post是一个合理的摘要。
答案 1 :(得分:1)
还有另一种方法 - 使用json2.js
var postdata = new Object();
postdata.parameter1 = <value>;
postdata.parameter2 = <value>;
$.ajax({
type: "POST",
url: 'MyHandler.ashx',
dataType: "application/json",
data: JSON.stringify(postdata),
async: true,
success: function (data) { Handler_Success(data); }
});
});
每次添加新参数时,您都不会格式化JSON字符串。确保在服务器端使用相同的名称读取它,否则这不会起作用。
JSON 2可在此处找到:https://github.com/douglascrockford/JSON-js/blob/master/json2.js
如果这对您有用,请标记为答案