2013-02-09 7 views
6

Mam projekt przy użyciu MVC4, chcę zapytać, jak uzyskać dane z webapi i wrócić do widoku.jak zadzwonić do interfejsu API w kontrolerze i wrócić do widoku MVC4

model

public class Name 
{ 
    public Int32 NameId { get; set; } 
    public String FirstName{ get; set; } 
    public String LastName{ get; set; } 
    public String CreatedBy { get; set; } 
} 

public class IListMyProject 
{ 
    public List<Name> Names { get; set; } 
} 

mogę wymienić wszystkich w moim Index.cshtml przy użyciu tego kodu

public ActionResult Index() 
    { 
     string securityToken = repo.GetTokens(); 
     if (securityToken != null) 
     { 
      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/Get?$orderby=LastName&$top=10"); 
      string authHeader = System.Net.HttpRequestHeader.Authorization.ToString(); 
      httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken)); 
      var response = client.SendAsync(httpRequestMessage) 
       .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()) 
       .Result; 
      if (response.IsSuccessStatusCode) 
      { 
       model.Names = response.Content.ReadAsAsync<IList<Name>>().Result.ToList(); 

      } 
     } 
     return View("Index", model); 
    } 

mogę wrócić mój pogląd. i teraz mam inny pogląd zwany Details.cshtml z tego kodu:

public ActionResult Details(string id) 
    { 
     string securityToken = repo.GetTokens(); 
     if (securityToken != null) 
     { 
      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/GetById/"+id+""); 
      string authHeader = System.Net.HttpRequestHeader.Authorization.ToString(); 
      httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken)); 

      var response = client.SendAsync(httpRequestMessage) 
       .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()) 
       .Result; 
      if (response.IsSuccessStatusCode) 
      { 

       model.Names = response.Content.ReadAsAsync<IList<Name>>().Result.ToList(); 

      } 
     } 
     return View(model); 
    } 

Dla tego szczegółu, mój Json wygląda następująco:

application/json, text/json 
{ 
    "NameId": 1, 
    "FirstName": "This is First Name", 
    "LastName": "This is Last Name", 
    "CreatedBy": "This is Created By" 
} 

gdy uruchamiam go, otrzymuję ten błąd:

Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IList`1[Models.Name]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. 

To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 

Path 'NameId', line 1, position 10. 

Jak to naprawić, jestem nowy w webapi. Zastanawiam się, dlaczego, jeśli mogę wyświetlić listę wszystkich (dla indeksu, używam api/get) działa, ale gdy chcę pokazać go szczegółowo, to nie działa.

dziękuję za pomoc

Pozdrowienia

EDIT

kiedy debugowania w

model.Names = response.Content.ReadAsAsync<IList<Name>>().Result.ToList(); 

jej mówi Null, jest coś nie tak, gdy próbuję uzyskać odpowiedź?

Odpowiedz

3

Kwestia jest taka, że:

{ 
    "NameId": 1, 
    "FirstName": "This is First Name", 
    "LastName": "This is Last Name", 
    "CreatedBy": "This is Created By" 
} 

nie można rozszeregować jako IList. JSON, który masz powyżej to tylko jedno imię, a nie zbiór imion. Tak więc deserializacja Json.NET zakończy się niepowodzeniem.

Upewnij się, że kontroler Web API zwraca ilistę lub zmień kod MVC, aby odczytać zawartość jako pojedynczą nazwę. Zbiór nazwisk w JSON będzie wyglądać tak zamiast:

[{ 
    "NameId": 1, 
    "FirstName": "This is First Name", 
    "LastName": "This is Last Name", 
    "CreatedBy": "This is Created By" 
}, 
{ 
    "NameId": 2, 
    "FirstName": "This is First Name", 
    "LastName": "This is Last Name", 
    "CreatedBy": "This is Created By" 
}] 
+0

ja myśl, że to mój problem. ale nie robię webapi, używam go tylko w moim mvc. jak wyświetlić ten json? dziękuję bro –

+1

dobrze, a następnie przeczytaj treść jako nazwę, a nie jako IList , jeśli nie kontrolujesz usługi internetowej ... –

+0

Używam var NamesId = response.Content.ReadAsAsync () .Result; i kiedy debuguję na NamesId, mogę uzyskać wynik. ale jak mogę wrócić do widoku Details.cshtml? –

1

API Web wraca pojedynczy obiekt typu Nazwa, a nie zbiory Nazwa. Nie widzę, gdzie definiujesz model model. Dodałem definicję typu Nazwa. Spróbuj tego.

public ActionResult Details(string id) 
{ 
    string securityToken = repo.GetTokens(); 
    Name model; 
    if (securityToken != null) 
    { 
     HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "webapiurl/api/Name/GetById/"+id+""); 
     string authHeader = System.Net.HttpRequestHeader.Authorization.ToString(); 
     httpRequestMessage.Headers.Add(authHeader, string.Format("JWT {0}", securityToken)); 

     var response = client.SendAsync(httpRequestMessage) 
      .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()) 
      .Result; 
     if (response.IsSuccessStatusCode) 
     { 

      model = response.Content.ReadAsAsync<Name>(); 

     } 
    } 
    return View(model); 
} 
+0

cześć, próbuję tego, a wynikiem jest "wartość nie może być pusta". –

+0

Niestety, nie rozumiem pierwotnego pytania. Spójrz na moją zaktualizowaną odpowiedź, aby sprawdzić, czy to pomaga. –

1

Problem wydaje się być fakt, że JSON zwraca tylko 1 rekord, gdy czytasz ten wynik jako IList<Name>. Zmiana tego na po prostu Name powinna rozwiązać problem.

jednak, że pytanie brzmi: „jak zadzwonić Web API w kontrolerze i powrócić do widoku MVC4

polecam Ci spojrzeć na http://restsharp.org/ Można uprościć swój kod do:

public ActionResult Details(string id) 
{ 
    string securityToken = repo.GetTokens(); 
    Name model; 
    if (securityToken != null) 
    { 
     var client = new RestClient(""); 

     var request = new RestRequest("webapiurl/api/Name/GetById/"+id, HttpMethod.Get); 
     string authHeader = System.Net.HttpRequestHeader.Authorization.ToString(); 
     request.AddHeader(authHeader, string.Format("JWT {0}", securityToken)); 

     var model = client.Execute<Name>(request); 
    } 
    return View(model); 
} 
Powiązane problemy