是否可以使用ASP.Net 2.0在ASPX页面中托管WebService?

时间:2012-04-06 17:02:13

标签: asp.net vb.net jquery jquery-datatables

在将页面从正常回发转换为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是否无法在ASPX页面中使用<WebMethod()>

3 个答案:

答案 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()

  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传递给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

  4. <强>更新

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

    <configuration>

答案 2 :(得分:0)

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

我做了什么。

  1. Microsoft ASP.NET 2.0 AJAX Extensions 1.0。
  2. WEB.CONFIG更新/附加了[LINK] [1] [1]中给出的内容:http://www.asp.net/AJAX/Documentation/Live/ConfiguringASPNETAJAX.aspx