我在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();
}
仍然没有......
答案 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();
}
答案 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'