4

我正在尝试调用在我的一个 aspx 页面文件中找到的以下 webmethod:

[WebMethod]
public static string GetReportDetails()
{
    var reportDetails = DataAccess.Database().GetBusinessInterestReportDetails(HttpContext.Current.User.Identity.Name);
    var json = BusinessInterestReport.GetJson(reportDetails); 
    return json;
}

这是我用来调用 webmethod 的 javascript:

 $.ajax({
      type: 'POST',
      url: 'SummaryReport.aspx/GetReportDetails',
      dataType: 'json',
      success: function (data) {
           alert(data);
      },
      error: function (jqXHR, textStatus, errorThrown) {
           alert('An error has occured: ' + errorThrown);
      }
 });

进行此 ajax 调用的 javascript:

$('.reportOption').click(function (e) {
    $.ajax({
      type: 'POST',
      url: 'SummaryReport.aspx/GetReportDetails',
      dataType: 'json',
      success: function (data) {
           alert(data);
      },
      error: function (jqXHR, textStatus, errorThrown) {
           alert('An error has occured: ' + errorThrown);
      }
 });
})

配置ScriptModule已经在web.config. 断点甚至没有在 webmethod 上被击中,而是返回了整个页面的内容。知道是什么原因造成的吗?

编辑:使用 Chrome 的调试控制台,我发现了这个错误:

[ArgumentException: Unknown web method GetReportDetails.
Parameter name: methodName]
   System.Web.Script.Services.WebServiceData.GetMethodData(String methodName) +516665
   System.Web.Handlers.ScriptModule.OnPostAcquireRequestState(Object sender, EventArgs eventArgs) +168
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

为什么它不选择方法名称?我还启用了 PageMethods 使用<asp:ScriptManager ID="smMain" runat="server" EnablePageMethods="true" />

PS 刚刚意识到我是从 iFrame 中调用它的。这可能与问题有关吗?

4

5 回答 5

1

我认为您需要明确添加contentType,因为它的默认值是application/x-www-form-urlencoded; charset=UTF-8,这不是您想要的。

所以你可能想稍微修改一下你的 jQuery 代码。

$.ajax({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  url: "SummaryReport.aspx/GetReportDetails",
  dataType: "json",
  success: function (data) {
      alert(data);
  },
  error: function (jqXHR, textStatus, errorThrown) {
      alert('An error has occured: ' + errorThrown);
  }
});
于 2012-12-20T14:53:15.093 回答
0

从您的方法中删除static关键字。GetReportDetails

于 2012-12-21T06:34:28.080 回答
0

不要在您的 Web 方法中编写管道代码(JSON 序列化/反序列化)。只需获取/返回模型(.NET POCO 对象):

[WebMethod]
public static string GetReportDetails()
{
    var reportDetails = DataAccess.Database().GetBusinessInterestReportDetails(HttpContext.Current.User.Identity.Name);
    return reportDetails;
}

然后消费:

$.ajax({
    type: 'POST',
    url: 'SummaryReport.aspx/GetReportDetails',
    contentType: 'application/json',
    success: function (data) {
        // the actual object will be inside data.d
        var reportDetails = data.d;
        // Now you could directly use the properties of your model
        // For example if your ReportDetails .NET type had a string property
        // called FooBar you could directly alert(reportDetails.FooBar);
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert('An error has occured: ' + errorThrown);
    }
});

注意事项:

  • 我们已经明确指定了contentType: 'application/json'向 web 方法指示我们想要使用 JSON 作为传输机制
  • 我们已经摆脱了该dataType: 'json'属性,因为 jQuery 足够智能,可以使用 Content-Type 响应标头并自动解析data传递给success回调的参数。

我还建议您阅读这篇关于consuming ASP.NET PageMethods directly from jQuery.

于 2012-12-21T07:03:00.707 回答
0

修复。事实证明,在 aspx 文件的顶部缺少继承属性。

所以现在我有:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SummaryReport.aspx.cs" MasterPageFile="~/MasterPages/SummaryReports.Master"
Inherits="Web.SummaryReport"
    %>
于 2012-12-21T08:37:10.500 回答
0

我想根据我在这个问题上的经验在这里贡献一个补充。如果您使用的是内容页面或母版页,则无法通过访问该页面来调用 WebMethod,而是添加一个 web 服务页面并使用它,请参阅它与我一起使用的此链接。 http://forums.asp.net/post/5822511.aspx

我复制到这里

继承 System.Web.Services.WebService

<WebMethod()> _
Public Function MyFunction() As String
    Return "Hello World"
End Function

然后您可以从母版页或内容页调用 webmethod,如下所示:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    function MyFunction() {
        var request = $.ajax({
            type: 'POST',
            url: 'HelloWord.asmx/MyFunction',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (serverdata) {
                alert("Done  " + serverdata);
            },
            error: function (error) {
                alert("error  ");
            }
        });
        return false;
    }
</script>

请务必取消注释:Web 服务页面中的 System.Web.Script.Services.ScriptService 行,因为在创建页面时会对其进行注释

于 2016-07-24T10:39:51.383 回答