0

在将页面从普通回发转换为 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>

有没有人有任何想法:

  1. 我做错了什么?
  2. 还是 ASP.Net 2.0 无法<WebMethod()>在 ASPX 页面中使用 a?
4

3 回答 3

1

看起来您的数据提供不正确。应该:

data: "{' + "What" + ':'" + "World" + "'}",

我选择了“什么”和“世界”,因为我认为它们是来自其他地方的变量值。

因此,如果:

var x = "World";


.ajax(){
.....
.data: "{'What':'" + x + "'}",

是正确的

高温高压

于 2012-04-06T19:24:32.690 回答
0

好的,我终于找到了完整的答案(以及对@TheGeekYouNeed 的 +1 证明是解决方案的一部分)。

ASP.Net 2.0 不支持开箱WebMethod()即用的 ASPX 页面。总共有三个步骤(对我来说)来启用对WebMethod()ASPX 页面的支持。

  1. 下载并安装Microsoft ASP.NET 2.0 AJAX Extensions 1.0
  2. 将以下内容添加到<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"/>

  3. stringify被传递给的 JavaScript 对象WebMethod()(以及 @TheGeekYouNeed 的道具)。jQuery 会自动将 JavaScript 对象转换为查询字符串的键/值对。另一方面,AJAX 扩展实际上要求将 JavaScript 对象字符串化为 JSON(不解析为 POST[ing] 或 GET[ting] 的键/值对),因为 HTTP Content-Type 标头必须设置为application/json. 由于 jQuery 不会转换data类型string,因此必须先将 JavaScript 对象字符串化为 JSON。然后可以将 JSON 字符串不受惩罚地传递给 AJAX 扩展。网上有很多关于字符串化的必要信息,只需搜索Invalid JSON primitive即可。就个人而言,我认为最好的解释来自Dave Ward 在 encosia.com 上

更新:

我在生产服务器上遇到了同样的问题(在 IIS7 上运行 .Net 4.0 Framework)。为了纠正生产服务器上的问题,我必须将以下内容添加到<configuration>元素下的 web.config 中:

<system.webServer>
    <modules>
      <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </modules>
    <handlers>
      <remove name="WebServiceHandlerFactory-Integrated"/>
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </handlers>
</system.webServer>
于 2012-04-11T14:15:00.117 回答
0

工作正常。自上周以来,我一直在研究这个问题。因为我的本地有 .NET 4 但由于 Web 服务器,我的源代码必须在 .Net 2.0 中开发

我做了什么。

  1. Microsoft ASP.NET 2.0 AJAX 扩展 1.0。
  2. WEB.CONFIG 更新/附加了 [LINK][1] [1] 中给出的内容:http ://www.asp.net/AJAX/Documentation/Live/ConfiguringASPNETAJAX.aspx
于 2014-01-28T10:21:02.300 回答