在将页面从正常回发转换为AJAX调用的过程中(使用JavaScript完全加载/控制UI并严格使用ASP.Net作为后端),我发现自己想要用AJAX替换GridView-来源数据集。
我目前使用DataTables来美化GridView,并且API中有一个选项可以使用AJAX远程获取表格的数据。 API需要返回一个JSON对象,虽然看起来我可以为fnServerData
选项提供回调,这将允许我将XML响应转换为必需的JSON数据源。
<WebMethod()>
来返回数据源......”虽然我过去曾写过几个<WebMethod()>
函数,但我我总是添加一个新的ASMX文件(带有一个自定义类来驱动它)或扩展现有的文件,这是有意义的。使用此特定页面,无需在页面上下文之外访问此表的数据源,因此我想我会尝试将<WebMethod()>
添加到ASPX页面的代码隐藏。
在程序员网上似乎有几个例子成功地解除了我的头发。
我已经按照我能找到的每个例子,没有人为我工作。我已经汇总了一个非常简单的例子,希望有人可以指出我出错的地方,或者确认ASP.Net 2.0不会以这种方式工作。
ASP加价:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AJAXText.aspx.vb" Inherits="_AJAXText" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
<script type="text/javascript" src='<%=Helpers.ToAbsoluteURL("~/_cs/js/jquery-1.6.4.min.js") %>'></script>
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: window.location.href + "/Hello",
data: {
"What": "World"
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data, textStatus, jqXHR) {
$('div').text(textStatus);
},
complete: function (jqXHR, textStatus) {
$('div').text(textStatus);
},
error: function (jqXHR, textStatus, errorThrown) {
$('div').text(textStatus);
}
});
});
</script>
</body>
</html>
代码隐藏:
Imports System.Web.Services
Partial Class _AJAXText
Inherits System.Web.UI.Page
<WebMethod()> _
Public Shared Function Hello(ByVal What As String) As String
Dim msg As String = "Hello, " & What & "!"
Return msg
End Function
End Class
我已经对上面做了几处小改动,并且在每种情况下AJAX调用都会返回以下内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Page</title>
</head>
<body>
<form name="form1" method="post" action="AJAXText.aspx?What=World%2fHello"
id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJOTU4MjMyMzI1ZGQT/2jrJ+cI2ERazl2Hw7l7TI5XiA==" />
</div>
<div></div>
</form>
<script type="text/javascript" src='http://localhost:3719/Maggie/_cs/js/jquery-1.6.4.min.js'></script>
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
url: window.location.href + "/Hello",
data: {
"What": "World"
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data, textStatus, jqXHR) {
$('div').text(textStatus);
},
complete: function (jqXHR, textStatus) {
$('div').text(textStatus);
},
error: function (jqXHR, textStatus, errorThrown) {
$('div').text(textStatus);
}
});
});
</script>
</body>
</html>
我期望返回的是:
<?xml version="1.0" encoding="utf-8"?>
<string>Hello, World!</string>
有没有人有任何想法:
<WebMethod()>
?答案 0 :(得分:1)
看起来您的数据提供不正确。应该是:
data: "{' + "What" + ':'" + "World" + "'}",
我选择了“什么”和“世界”,因为我认为这些是来自其他地方的变量值。
所以如果:
var x = "World";
.ajax(){
.....
.data: "{'What':'" + x + "'}",
是正确的
HTH
答案 1 :(得分:0)
好的,我终于找到了完整的答案(和@TheGeekYouNeed +1,原因是该解决方案的一部分)。
ASP.Net 2.0在开箱即用的ASPX页面中不支持WebMethod()
。总共有三个步骤(对我来说)在ASPX页面中支持WebMethod()
。
将以下内容添加到<httpModules>
<system.web>
部分的web.config
部分。
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
stringify
传递给WebMethod()
的JavaScript对象(和ergo,道具到@TheGeekYouNeed)。 jQuery会自动将JavaScript对象转换为查询字符串的键/值对。另一方面,AJAX Extensions有效地要求将JavaScript对象字符串化为JSON(未解析为POST [ing]或GET [ting]的键/值对),因为HTTP Content-Type标头必须设置为{ {1}}。由于jQuery不会转换application/json
类型的data
,因此必须首先将JavaScript对象字符串化为JSON。然后可以将JSON字符串传递给AJAX Extensions而不受惩罚。网上有很多关于字符串化的信息,只需搜索Invalid JSON primitive即可。就个人而言,我认为最好的解释来自Dave Ward over at encosia.com。
<强>更新强>
我在生产服务器上遇到了同样的问题(在IIS7上运行.Net 4.0 Framework)。要纠正生产服务器上的问题,我必须将以下内容添加到string
元素下的web.config中:
<configuration>
答案 2 :(得分:0)
完全正常工作。 自上周以来我一直在研究这个问题。 因为我的本地有.NET 4,但由于Web服务器我的源必须在.Net 2.0中开发</ p>
我做了什么。