【问题标题】:Get json data via ajax通过ajax获取json数据
【发布时间】:2012-04-10 04:23:54
【问题描述】:

希望这是一个相当简单的问题。请原谅我的无知,但我主要是 PHP/Zend 开发人员,所以我在 C# 和 Visual Studio 中遇到了 json/ajax 问题。我有什么明显的遗漏吗?任何帮助将不胜感激。我应该看List<>吗?

这是我在触发 javascript ajax 函数时收到的错误: “未知的网络方法 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;
}

这是js结果:

{"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
    }
});

【问题讨论】:

    标签: c# ajax json asp.net-ajax


    【解决方案1】:

    getwidgets 需要是静态的

    [WebMethod]
    public static String getwidgets()
    

    【讨论】:

    • 当我将其更改为静态时,我收到此错误:非静态字段、方法或属性“WidgetWebsite._Default.widgetsBLObject”需要对象引用
    • 我不知道widgetsBLObject是什么,但如果你必须使用它,那么它也需要是静态的。
    【解决方案2】:

    请记住,如果您希望将您的方法公开给来自 JavaScript 的调用,您需要使用 ScriptMethodAttribute 标记您的方法。因此使它看起来像这样:

    [ScriptMethod]
    [WebMethod]
    public static String getwidgets()
    {
       // Your core here
    }
    

    我会在方法中返回对象本身,而不是它的序列化版本,因为如果您将其标记为 [ScriptMethod],ASP.NET 将为您进行 JSON 序列化;因此在客户端中,您的变量 data.d 将包含对象本身,而不是稍后您必须反序列化的简单字符串,就像您当前的实现一样。

    【讨论】:

      【解决方案3】:

      您正在混合技术: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 中检索它
      • 没问题 - 我很快就会用一些示例代码更新我的答案。
      猜你喜欢
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多