从jQuery中调用C#后面的代码中的函数

时间:2013-11-05 04:43:03

标签: c# javascript jquery ajax

我在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()函数位于文件夹-DavaScripts

中的Dashboard.js中
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();
}

仍然没有......

3 个答案:

答案 0 :(得分:2)

我在这里注意到两件事,当你需要知道关于data.d的时候,你需要从代码隐藏方法返回XML,你可能需要了解data.d。

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

[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 Extensions序列化的所有ASMX服务JSON的情况。即使您只返回标量返回值,例如字符串,int或布尔值,结果将始终包含在“d”中。“参考:http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/

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

loadSuccess(data.d, status);

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

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

PS,我知道我的代码可以在Web服务中运行,但不能确定代码背后的代码,但它应该可以工作。

PSS,因为它是一个公共方法,所以更适合对Web方法进行Captialize,因此getDataByDate应该是GetDataByDate

答案 1 :(得分: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();
}

另见ScriptMethod

答案 2 :(得分: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");
            }
        });

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