2017-03-12 3 views
0

Je ne trouve pas la réponse et je ne peux pas résoudre mon problème en saisissant des données Json d'un MVP WepApi et en les envoyant à une liste déroulante..NET MVC Core Json/Async Tâches remplissant SelectList/IEnumerable

je reçois l'erreur suivante:

RuntimeBinderException: The best overloaded method match for 'Microsoft.AspNetCore.Mvc.Rendering.SelectList.SelectList(System.Collections.IEnumerable, string, string)' has some invalid arguments

Je prends les données Json en utilisant le code suivant, ce code est assis dans le Controlller en ce moment:

public async Task<IActionResult> GrabEmployees() 
    { 
     var item = new List<EmployeeViewModel>(); 

     using (var employee = new HttpClient()) 
     { 
      employee.BaseAddress = new Uri("http://localhost:5050/"); 
      employee.DefaultRequestHeaders.Accept.Clear(); 
      employee.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = await employee.GetAsync("api/employees"); 
      if (response.IsSuccessStatusCode) 
      { 
       item = await response.Content.ReadAsAsync<List<EmployeeViewModel>>(); 
      } 
     } 
     return ViewBag.Employees = item.Select(employee => new SelectListItem { Value = employee.EmployeeNumber, Text = (employee.FirstName + " " + employee.LastName) }); 
    } 

Donc, avec le code ci-dessus, je essayé de définir la tâche à une chaîne, IEnumerable, JsonResult, toutes sortes de choses, il me donne la même erreur. Cela m'amène à croire que la question pourrait être parce qu'elle est asynchrone. Je ne sais pas si, je suis nouveau à Json et MVC Core.

Voici comment je passe les informations dans la vue:

public IActionResult Assignments() 
    { 
     ViewData["Title"] = "Assign Asset"; 
     ViewData["Message"] = "Use this section to assign assets to Employees."; 
     ViewBag.Employees = GrabEmployees(); 
     ViewBag.Assets = AManger.GetAll(); 
     //Allows to assign assets to employees 
     return View(); 
    } 

Voici le code de la page Voir:

@model IEnumerable<Final.HRInventoryApp.Models.AssetViewModel> 

<h2>@ViewData["Title"]</h2> 
<h3>@ViewData["Message"]</h3> 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownList("Asset", new SelectList(ViewBag.Assets, "Id", "TagNumber")) 
    @Html.DropDownList("EmployeeId", new SelectList(ViewBag.Employees, "Value", "Text")) 
    <input type="submit" id="buttonsubmit" value="Submit" /> 

} 

Je reçois des résultats mitigés. Lorsque je lance l'application pour la première fois, la page se charge et la liste déroulante est remplie. Si je clique sur une autre page et reviens à cette page, elle échoue complètement avec cette erreur. Comment puis-je résoudre ce problème?

Répondre

0

On dirait que votre méthode GrabEmployees renvoie un IActionResult que vous définissez dans le viewbag dans l'autre méthode d'action! Aussi, vous avez une déclaration return ViewBag.Employees; dans cette méthode !! Cela ne semble pas correct. Vous devriez envisager de mettre à jour votre méthode GrabEmployees pour retourner les données que vous voulez (La collection de SelectListItem articles)

public async Task<IEnumerable<SelectListItem>> GrabEmployees() 
{ 
    var item = new List<SelectListItem>(); 

    using (var employee = new HttpClient()) 
    { 
     employee.BaseAddress = new Uri("yourUrlForApiEndpointHere"); 
     employee.DefaultRequestHeaders.Accept.Clear(); 
     employee.DefaultRequestHeaders.Accept 

          .Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response = await employee.GetAsync("api/employees"); 
     if (response.IsSuccessStatusCode) 
     { 
      var data = await response.Content.ReadAsAsync<List<EmployeeViewModel>>(); 
      return data.Select(x => new SelectListItem { Value = x.EmployeeNumber, 
              Text = (x.FirstName + " " + x.LastName) }); 
     } 
    } 
    return item; 
} 

Et dans l'autre méthode d'action, appeler cette méthode et le transmettre à voir.

public async Task<IActionResult> Assignments() 
{ 
    ViewData["Title"] = "Assign Asset"; 
    ViewData["Message"] = "Use this section to assign assets to Employees."; 
    var d = await GrabEmployees(); 
    ViewBag.Employees = d.ToList(); 
    // to do : Fix Assets the same way 
    return View(); 
} 

maintenant dans la vue,

@Html.DropDownList("EmployeeId", ViewBag.Employees as List<SelectListItem>) 
+0

Shyju merci de la réponse, mais cela ne work.If j'utilise 'await', il déclare que d'attendre ne peut être utilisé avec' async', si j'appelle le 'GrabEmployees()' sans lui 'GrabEmployees()' renvoie 'null'. – Chupacabra

+0

êtes-vous sûr que 'response.IsSuccessStatusCode' retourne' true'? – Shyju

+0

Oui, il retourne 'true' et les données sont passées dans la variable' data', je reçois ce qui suit lors du chargement de la vue 'Assignments' cependant' InvalidOperationException: Il n'y a aucun élément ViewData de type 'IEnumerable ' qui a la clé 'EmployeeNumber' .' – Chupacabra