2016-10-27 3 views
2

저는 웹 API에 익숙하지 않으며, 모든 예제가 C#에서 도움이되지 않습니다. 예를 들어 초기에로드 블록을 쳤습니다. SQL에서 데이터를 반환하고 개체 배열 목록을 넣은 다음 JSON 클라이언트에서 읽을 수 있도록 반환하려고합니다.ASP.NET 웹 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를 반환 할

조 이것은 내 문제의 대부분입니다.

+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)).


또한 웹 API 컨트롤러를 사용하고 있는지 확인하십시오. 이 컨트롤러는 ApiController 클래스에서 파생됩니다 (대략 비슷하지만, System.Web.Mvc.Controller에서 파생 된 MVC 컨트롤러와 반대).

+0

정직하게 말하자면, 나는 당신이 의미하는 바를 거의 느낄 수 없습니다. 다음과 같이 수정했습니다 : 반환 형식을'As IEnumerable (Of SiteDetails) '로 변경하고 내 사이트 배열을 변경했습니다. 'Dim Sites는 새로운 목록으로 (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'에서 상속합니까?그것은 당신이 웹 API 컨트롤러 대신 MVC 컨트롤러를 사용하는 것 같습니다. 샘플 프로젝트에서는 API 코드를 ValuesController에 넣어야합니다. HomeController 클래스는 MVC 컨트롤러입니다. HomeController에 샘플 코드를 넣었습니다. 결과는 귀하의 코멘트에서와 같이'System.Collections.Generic.List''1 [TestWebAPI.SiteDetails]'입니다. 따라서 API 컨트롤러를 사용하지 않는 것으로 보입니다. – Markus

관련 문제