2016-10-27 24 views
2

私はWeb APIを初めて使用しています。すべての例はC#でサポートされていません。早い段階でロードブロッキングが発生しました。 SQLからデータを戻してオブジェクト配列のリストを入れてから、JSONクライアントが読み取れるように返すようにしています。ASP.NET Web APIがJSONとしてArrayListを返します

これは私のデフォルトは、私のコントローラ上で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のを返すことを許可しないことができないので、単にコメントする

ジョー

EDIT、上記は、オフから動作しません。これは私の問題の大部分です。

+0

'ArrayList'を使用しないでください。これは古いコードとの下位互換性のためだけに存在します。代わりに強く型付けされた 'List(Of T)'を使用する –

答えて

1

サンプルでは、​​IEnumerable(Of String)が返されます。したがって、あなたのアクションメソッドの結果を返すときは、ToStringメソッドを呼び出すことですべてのオブジェクトが文字列に変換されます(プロジェクトでOPTION STRINGがオフになっていると思われます)。あなたのケースでは、デフォルト実装ToStringが使用されます。この実装は、型の名前を返します。あなたはすべてのオブジェクトのプロパティを返すようにしたい場合は、

  • をしたい場合はFunction Index() As IEnumerable(Of SiteDetails)
  • にあなたのアクションメソッドのシグネチャを変更します。

    次のようにデータを返すために、私は、コードを変更したいですいくつかの文字列を返すには、アクションメソッドのシグネチャをそのまま残しますが、必要なデータが文字列として正しくフォーマットされるように、SiteDetailsクラスのToStringメソッドをオーバーライドします。

さらに、ArrayListクラスを使用しないことを提案します。 List(Of T)クラスがあります(場合によってはList(Of SiteDetails)を返す場合はSiteDetailsオブジェクト、List(Of String)の場合は文字列を返す)。


また、Web APIコントローラを使用していることを確認してください。これらのコントローラは、ApiControllerクラスから派生しています(おおよそ同じであるが、System.Web.Mvc.Controllerから派生したMVCコントローラとは対照的です)。

+0

正直言って、私はあなたが意味することを大まかに把握しています。戻り値の型を 'As IEnumerable(Of SiteDetails)'に変更し、 'Dim Sitesは新しいリスト(Of SiteDetails)'として - ページの出力は 'System.Collections.Generic.List'1になりました[OnsiteAPI.SiteDetails]' - どこが間違っていましたか?私に戻ってくれてありがとうbtw :) – fl3rgle

+0

どのページに出力していますか?私はあなたの 'SiteDetails'クラスと' List(Of SiteDetails) 'を使って' IEnumerable(Of SiteDetails) 'を返すメソッドのサンプルプロジェクトを作成しました。 Edgeでは、データはJSON形式で表示されます。[{"site": "site1"、 "siteid": "1"}、{"site": "site2"、 "siteid": "2"}] – Markus

+0

あなたのコントローラクラスは 'ApiController'から継承していますか?Web APIコントローラの代わりにMVCコントローラを使用しているようです。サンプルプロジェクトでは、APIコードをValuesControllerに配置する必要があります。 HomeControllerクラスはMVCコントローラです。サンプルコードをHomeControllerに入れました。あなたのコメントのように、結果は 'System.Collections.Generic.List''1 [TestWebAPI.SiteDetails]'です。したがって、あなたはAPIコントローラを使用していないようです。 – Markus

関連する問題