2012-03-26 169 views
4

希望這是一個相當簡單的問題。請原諒我的無知,但我主要是PHP/Zend開發人員,所以我在C#和Visual Studio中用json/ajax問題掙扎了一下。有什麼明顯的我失蹤?任何幫助將不勝感激。我應該看看List<>通過ajax獲取json數據

這是我在啓動javascript ajax函數時收到的錯誤: 「未知的Web方法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 
    } 
}); 

回答

1

getwidgets需求是靜態

[WebMethod] 
public static String getwidgets() 
+0

當我將其更改爲靜態時,出現此錯誤:非靜態字段,方法或屬性'WidgetWebsite._Default.widgetsBLObject'需要對象引用' – user1293504 2012-03-26 18:11:20

+1

我不知道widgetsBLObject是什麼,但如果你必須使用它,那麼它也需要是靜態的。 – 2012-03-26 18:17:14

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。

+0

對不起菲利普,你失去了我。我不確定'你的響應的內容類型設置爲JSON'是什麼意思。我只是已經有了一個JSON字符串,需要在ajax中檢索它 – user1293504 2012-03-26 18:10:31

+0

沒問題 - 我馬上用一些示例代碼更新我的答案。 – 2012-03-26 18:12:29

1

請記住,如果您希望您的方法暴露給來自JavaScript的調用,則需要使用ScriptMethodAttribute標記您的方法。因此,使它看起來像這樣:

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

我會回來的方法,對象本身,而不是不序列化版本的它,因爲ASP.NET將JSON序列化你,如果你把它標記爲[ScriptMethod] ;所以在客戶端,你的變量data.d將包含對象本身,而不是一個簡單的字符串,以後你必須反序列化,就像你當前的實現一樣。