2016-10-27 114 views
2

我是新來的web API,所有的例子都在C#中沒有幫助,因此我早就遇到了障礙。我從SQL返回數據,將其放入一個對象數組列表中,然後嘗試返回它,以便它可以被JSON客戶端讀取。ASP.NET Web API返回ArrayList爲JSON

這是我控制我的默認GET:

Function Index() As IEnumerable(Of String) 
      Dim Sites As New ArrayList 
      Dim dt As DataTable = DataLayer.ExecuteNoParamStoredProcedure("stored_proc", "connection_string") 

      For Each r As DataRow In dt.Rows() 
       Sites.Add(New SiteDetails(r("SiteName"),r("SiteId"))) 
      Next 

      Return Sites 
     End Function 

這裏是我的SiteDetails類:

Public Class SiteDetails 
Public site As String 
Public siteid As String 

Public Sub New(sitename As String, id As String) 
    site = sitename 
    siteid = id 
End Sub 
End Class 

問題:我如何使它輸出頁面上的數據的格式這不是一個錯誤或只是對象名稱?有沒有更好的方式來做我正在做的事情?

編輯只是發表評論,上面並沒有從下班,因爲它不能返回類型(IEnumerable的(串))不允許返回一個ArrayList ,這是我的問題的大部分。

+0

千萬不要使用'ArrayList'。這仍然只是爲了向後兼容舊代碼。使用強類型的'List(Of T)'而不是 –

回答

1

在您的示例中,您將返回一個IEnumerable(Of String)。因此,在返回操作方法的結果時,通過調用ToString方法(我懷疑在項目中將OPTION STRING設置爲OFF),將所有對象轉換爲字符串;在你的情況下,使用默認實現ToString。該實現返回類型的名稱。

爲了返回數據,我會改變的代碼如下:

  • 如果你想返回所有對象的屬性,你的動作方法的簽名更改爲Function Index() As IEnumerable(Of SiteDetails)
  • 如果你想要返回一些字符串,請保持您的操作方法的簽名保持原樣,但重寫SiteDetails類的ToString方法,以便將所需數據正確格式化爲字符串。

另外,我建議不要再使用ArrayList類;有一個強類型的List(Of T)類(在您的情況下,如果要返回SiteDetails對象,則返回List(Of SiteDetails);如果要返回字符串,則返回List(Of String))。


此外,請確保您使用的是Web API控制器。這些控制器來源於ApiController類(與MVC控制器看起來大致相同,但源自System.Web.Mvc.Controller)。

+0

誠實地說,我只是鬆散地理解你的意思,我修改如下:將我的返回類型改爲'IEnumerable(Of SiteDetails)'並且改變了我的站點數組是:'昏暗的網站作爲新的List(Of SiteDetails)' - 頁面上的輸出現在是'System.Collections.Generic.List'1 [OnsiteAPI.SiteDetails]' - 我哪裏出錯了?感謝您回到我btw :) – fl3rgle

+0

你在哪個頁面上輸出?我在一個返回IEnumerable(Of SiteDetails)''的方法中創建了一個包含'SiteDetails'類和'List(Of SiteDetails)'的示例項目。在Edge中,數據以JSON格式顯示:[{「site」:「site1」,「siteid」:「1」},{「site」:「site2」,「siteid」:「2」}]。 – Markus

+0

您的控制器類是否從'ApiController'繼承?看起來你使用的是MVC控制器而不是Web API控制器。在示例項目中,您應該將API代碼放入ValuesController中; HomeController類是一個MVC控制器。我把我的示例代碼放到HomeController中,結果是'System.Collections.Generic.List''1 [TestWebAPI.SiteDetails]',就像你的評論一樣。所以看起來你並沒有使用API​​控制器。 – Markus