2009-08-14 78 views
3

我有一個Silverlight應用程序調用與Silverlight控件在同一應用程序中託管的ashx。Silverlight訪問ashx JSON響應

的ASHX做以下(精簡):

// Basic object 
class SomeObject 
{ 
    int ID { get; set; } 
    string Description { get; set; } 
    double Value { get; set; } 
} 


// ASHX details 
DataLayer dl = GetDataLayer(); 
List<SomeObject> lst = dl.ListObjects(); 
string result = ""; 
if (lst != null) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    result = serializer.Serialize(lst); 
} 
context.Response.ContentType = "application/json"; 
context.Response.Write(result); 
context.Response.End(); 

現在我有麻煩的部分是做什麼用我的Silverlight控件的ASHX做。

我正在尋找調用ashx,然後將JSON結果映射到我的內部silverlight對象。看起來像一個非常簡單的任務,但我不知道如何訪問ashx或處理它的響應。由於Silverlight有一個精簡版的.NET,所以它會拋棄我。

任何幫助/建議嗎?

使用Silverlight 3,ASP.NET 3.5。

回答

0

感謝您的答覆喬恩。你的鏈接幫助我弄清楚了,我想我應該把這個問題中使用的代碼包含在將來遇到這個問題的其他人的代碼中。

兩種處理Json的方法。對於這兩種方法,您需要設置一個處理程序來獲取Json數據。

// This gets the URL to call to get the Json data 
Uri uri = GetSomeUrl(); 
WebClient downloader = new WebClient(); 
downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted); 
downloader.OpenReadAsync(uri); 

然後,您需要實現以上的代碼來處理JSON指定的事件處理程序downloader_OpenReadCompleted。在這兩種情況下,下面的代碼應該被包裝在一個using語句:

using (System.IO.Stream strResult = e.Result) 
{ 
} 

第一種方式來處理JSON數據是Silverlight框架的一部分,是爲了添加引用System.Json

JsonArray jsonArray = (JsonArray)JsonArray.Load(e.Result); 
List<SomeObject> lst = new List<SomeObject>(); 
foreach (System.Json.JsonObject obj in jsonArray) 
{ 
    SomeObject obj = new SomeObject(); 
    obj.ID = int.Parse(obj["ID"].ToString(); 
    obj.Description = obj["Description"].ToString(); 
    obj.Value = double.Parse(obj["Value"].ToString()); 
    lst.Add(obj); 
} 

這是可能有或沒有Silverlight的另一種方式是:

System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = 
    new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<SomeObject>)); 
List<SomeObject> lst = (List<SomeObject>)(serializer.ReadObject(strResult)); 

這兩種方法最終得到了我對象的列表,它作爲我認爲合適的我就可以使用。

感謝您的幫助喬恩!