2017-03-12 8 views
0

Ich kann die Antwort nicht finden, noch kann ich mein Problem mit dem Ergreifen von Json-Daten von einem MVC WepApi beheben und es an eine Dropdown-Liste senden..NET MVC Core JSON/Async Aufgabe, die SelectList/IEnumerable füllt

bekomme ich folgende Fehlermeldung:

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

Ich packe die JSON-Daten mit dem folgenden Code, dieser Code ist jetzt in der Control sitzen:

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) }); 
    } 

Also mit der obigen Code I versucht, die Aufgabe auf eine Zeichenfolge, IEnumerable, JsonResult, alle Arten von Sachen, die es gibt mir den gleichen Fehler. Es führt mich zu der Annahme, dass das Problem sein könnte, weil es asynchron ist. Ich weiß es nicht, ich bin neu in Json und MVC Core.

Hier ist, wie ich die Informationen in die Ansicht übergeben:

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(); 
    } 

Hier ist der Quelltext der Seite anzeigen:

@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" /> 

} 

ich gemischte Ergebnisse bin immer. Wenn ich die Anwendung zum ersten Mal lade, wird die Seite geladen und das Dropdown wird ausgefüllt. Wenn ich auf eine andere Seite klicke und zu dieser Seite zurückkomme, scheitert es vollständig mit diesem Fehler. Wie kann ich das beheben?

Antwort

0

Sieht so aus, als ob Ihre GrabEmployees Methode eine IActionResult zurückgibt, die Sie in der anderen Aktionsmethode auf den Viewbag setzen! Auch Sie haben eine Aussage return ViewBag.Employees; in dieser Methode !! Das sieht nicht korrekt aus. Sie sollten Ihre GrabEmployees Methode der Aktualisierung sollten Sie die gewünschten Daten (Die Sammlung von SelectListItem Artikel)

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; 
} 

Und in der anderen Aktionsmethode zurückzukehren, diese Methode aufrufen, und übergeben Sie sie sehen können.

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(); 
} 

nun in der Ansicht,

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

Shyju danken die für die Antwort, aber die work.If ich nicht 'await' es, die nur besagt, erwarten kann mit' async' verwendet werden, Wenn ich 'GrabEmployees()' ohne es 'GrabEmployees()' '' nenne, gibt 'null' zurück. – Chupacabra

+0

Sind Sie sicher, dass "response.IsSuccessStatusCode" 'true' zurückgibt? – Shyju

+0

Ja, es gibt 'true' zurück und Daten werden in die Variable' data' übergeben. Beim Laden der Ansicht 'Zuweisungen' bekomme ich Folgendes: 'InvalidOperationException: Es gibt kein ViewData-Element vom Typ 'IEnumerable ' der Schlüssel 'EmployeeNumber'. – Chupacabra

Verwandte Themen