使用 Ajax 获取 JSON 数据

4
希望这是一个相当简单的问题。请原谅我的无知,我大多是一位PHP / Zend开发人员,因此在处理C#和Visual Studio中的json / ajax问题方面有些困难。我是否忽略了一些明显的东西?任何帮助将不胜感激。我应该看 List<> 吗?
当我调用javascript ajax函数时,会收到以下错误信息:"Unknown web method getwidgets."。
我在C#中有一个数据集,我通过JSON转换器方法运行它。这很好地工作,并以JSON字符串返回我的数据。
private widgetsBL widgetsBLObject = new widgetsBL();

[WebMethod]
public String getwidgets()
{
    DataSet results = new DataSet();
    results = widgetsBLObject.selectTheWidgets();

    string jsresults = MyClassLibrary.JqueryTools.GetJSONString(results.Tables[0]);
    return jsresults;
}

这里是jsresults:
{"Table" : [  {"widgetid" : "1","widgetname" : "gizmo1000","widgetdescription" : "very cool widget"},
{"widgetid" : "2","widgetname" : "gizmo2000","widgetdescription" : "decent widget"},
{"widgetid" : "3","widgetname" : "gizmo3000","widgetdescription" : "terrible widget"}     ]}

我的Javascript调用:

$.ajax({
    type: "POST",
    url: "my.aspx/getwidgets",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
       // do stuff with returned data
    }
});
3个回答

1

getwidgets 需要是静态的

[WebMethod]
public static String getwidgets()

当我将其更改为静态时,我会收到此错误:需要对象引用才能访问非静态字段、方法或属性“WidgetWebsite._Default.widgetsBLObject”。 - user1293504
1
我不知道widgetsBLObject是什么,但如果你必须使用它,那么它也需要是静态的。 - Claudio Redi

1
请记住,如果您希望JavaScript能够调用您的方法,则需要使用ScriptMethodAttribute标记您的方法。因此,您的方法应该像这样:
[ScriptMethod]
[WebMethod]
public static String getwidgets()
{
   // Your core here
}

我会在方法中返回对象本身而不是其序列化版本,因为如果你将其标记为[ScriptMethod],ASP.NET会自动将其JSON序列化;所以在客户端,你的变量data.d将包含对象本身,而不是一个简单的字符串,后者需要在当前实现中进行反序列化。

0

你正在混合使用技术:my.aspx 用于呈现 HTML 内容,但它也可以用于实现 REST 功能。

在你的情况下,最简单的方法是将你的代码实现为 Page_Loaded() 方法的一部分。确保首先清除响应(这样你就不会在响应中有任何额外的标记)。此外,你可能希望将响应的内容类型设置为 JSON(而不是默认的 html):

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ClearContent();
        Response.ContentType = "application/json";

        DataSet results = new DataSet();
        results = widgetsBLObject.selectTheWidgets();

        string jsresults = MyClassLibrary.JqueryTools.GetJSONString(results.Tables[0]);
        return jsresults;
    }

然后在 my.aspx 页面中检索您的 JSON 字符串(不是 getwidgets)。

此外,由于您没有发布任何数据,请考虑在 AJAX 调用中使用 GET 而不是 POST。


抱歉,菲利普,你让我有些摸不着头脑。我不确定你所说的“将响应的内容类型设置为JSON”是什么意思。我只是已经有一个JSON字符串,并需要在ajax中检索它。 - user1293504
没问题 - 我会很快更新我的回答并提供一些示例代码。 - Philipp Schmid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接