0

我在 Visual Studio 2008 中有一个 asp Web 应用程序。我在一个文件夹中有 jquery-1.10.2.js - JavaScriptBase

解决方案中的文件 1. Dashboard.aspx 2. JavaScripts/Dashboard.js

我有一个 jQuery 选项卡

<li><a href="#tabs-1" id="tab1" runat="server" onclick="GetData(0)">Today</a></li>
<li><a href="#tabs-2" id="tab2" runat="server" onclick="GetData(7)">1-7 days</a></li>
<li><a href="#tabs-3" id="tab3" runat="server" onclick="GetData(30)">30 days</a></li>
<li><a href="#tabs-4" id="tab4" runat="server" onclick="GetData(60)">60 days</a></li>
<li><a href="#tabs-5" id="tab5" runat="server" onclick="GetData(90)">90 days</a></li>
<li><a href="#tabs-6" id="tab6" runat="server" onclick="GetData(180)">180 days</a></li>

GetData() 函数位于文件夹中的 Dashboard.js 中 - JavaScripts

function GetData(ky)
{
var params = "{'days' : '" + ky + "'}";   // if no params need to use "{}"
alert(params);
        $.ajax({
            url: "Dashboard.aspx/getDataByDate",
            type: 'POST',
            data: params,
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, status) {
                loadSuccess(data, status);
            },
            error: function () {
                alert("Oops! It's an Error");
            }
        });

        return false;
}

在我的代码后面

public string getDataByDate(string days)
        {
            DataSet ds = new DataSet();
            ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
            return ds.GetXml();
        }

当我调用该函数时,它总是转到错误函数。

如何从js文件中调用后面代码中的函数。请帮忙...

编辑 1

我根据 Grundy 的建议更改我的 cs 代码

[WebMethod()]
public string getDataByDate(string days)
{
DataSet ds = new DataSet();
ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
return ds.GetXml();
}

仍然没有得到..

4

3 回答 3

2

我在这里注意到两件事,当它需要 JSON 并且您可能需要了解 data.d 时,您正在从您的代码后面的方法返回 XML。

首先,您将需要非常流行且强大的JSON.NET库,以便轻松将 XML 序列化为 JSON。我不认为 System.Web.Script.Serialization.JavaScriptSerializer (你也没有使用,我知道)是为了处理 XML 到 JSON 而构建的,所以使用 NUGET 添加 JSON.NET 库,你的代码应该是:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object getDataByDate(string days)
{
    DataSet ds = new DataSet();
    ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
    string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(ds.GetXml());
    return json;
}

如果您使用的是 .NET 3.5,即使您使用的是代码隐藏方法而不是 Web 服务,您也需要了解“d”,以确保安全:

“通过 ASP.NET 3.5 中的 ASP.NET AJAX 扩展序列化的所有 ASMX 服务 JSON 都是这种情况。即使您只返回标量返回值,例如字符串、int 或布尔值,结果将始终括在“d”内。” 参考:http ://encosia.com/a-break-change-between-versions-of-aspnet-ajax/

因此,如果您使用的是 .NET 3.5,您的 jQuey.ajax 成功回调实现需要是:

loadSuccess(data.d, status);

如果您使用的是 .NET 4.0 或更高版本,则无需担心“d”。

您应该考虑将此实现移至 Web 服务,这将与我在答案中包含的几乎相同的代码。Web 服务更适合在项目中为 ajax 调用组织代码,并且 Web 服务似乎更适合处理解析 ajax 请求和响应,然后来自后面的代码,尽管后者是一个猜测,并且 ASP.NET 可以处理具有 WebMethod 属性的方法完全相同的方式,无论是在代码后面还是在 Web 服务中,但是代码的组织是在 Web 服务而不是代码后面实现 getDataByDate 的充分理由,因为它本身没有“连接”到您的 aspx 页面并且可能需要在多个页面中调用。它很容易实现,只需创建一个服务文件夹,添加一个新的 Web 服务,随意命名,删除关键字 static,并将您的 ajax url 更改为“/services/[yourwebserivcename].asmx/getDataByDate”。

PS,我知道我的代码可以在 Web 服务中工作,从后面的代码中不太确定,但它应该可以工作。

PSS,由于是公共方法,所以更适合Captialize web方法,所以getDataByDate应该是GetDataByDate

于 2013-11-05T08:28:04.243 回答
1

代替

var params = "{'days' : '" + ky + "'}";

利用

var params = {};
params.days = ky;

$.ajax({
            url: "Dashboard.aspx/getDataByDate",
            type: 'POST',
            data: JSON.stringify(params),
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, status) {
                loadSuccess(data, status);
            },
            error: function () {
                alert("Oops! It's an Error");
            }
        });

还要确保 url 路径正确。您可以使用 '../' 从当前文件夹 '../Dashboard.aspx/getDataByDate' 出来

于 2013-11-05T06:46:56.240 回答
1

尝试在此 (getDataByDate) 方法上使用WebMethod属性

更新

尝试像这样更改您的方法:

[WebMethod,ScriptMethod(...params if need...)]
public static string getDataByDate(string days)
{
    DataSet ds = new DataSet();
    ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
    return ds.GetXml();
}

另见脚本方法

于 2013-11-05T06:14:13.000 回答