2017-03-12 11 views
0

答えを見つけることができず、MVC WepApiからJsonデータを取得し、ドロップダウンリストに送信することで問題を解決できません。上記のコードで.NET MVC Core Json/AsyncタスクSelectFC/IEnumerableを埋め込む

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

だから私は:

私は次のエラーを取得する:

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

私は、次のコードを使用してJSONデータをつかむ、このコードは今Controlllerに座っていますタスクを文字列、IEnumerable、JsonResult、私に同じエラーを与えるものすべての種類に設定しようとしました。それは私が非同期であることが原因である可能性があると信じさせる。私は知らないけど、私はJsonとMVC Coreの新人です。ここで

は私が見るに情報を渡す方法です。ここで

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

は、表示ページのコードです:

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

} 

私は混合の結果を取得しています。最初にアプリケーションを起動すると、ページがロードされ、ドロップダウンが入力されます。別のページをクリックしてそのページに戻ると、そのエラーで完全に失敗します。 これを修正するにはどうすればよいですか?

答えて

0

GrabEmployeesのように見えますが、他のアクション方法でビューバックに設定しているIActionResultが返されています。また、その方法でreturn ViewBag.Employees;というステートメントがあります!それは正しく見えません。あなたがしたいデータ(SelectListItemアイテムのコレクション)

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

そして、あなたの他のアクションメソッドで 、このメソッドを呼び出して表示するためにそれを渡すを返すために、あなたのGrabEmployeesの更新方法を検討してください。

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

は今ビューで、

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

Shyjuは、返信用の感謝が、それはwork.If私は 'await'を使用し、それが、唯一async''で使用することができます待つことを述べていません'GrabEmployees()'を呼び出さなければ 'GrabEmployees()'は 'null'を返します。 – Chupacabra

+0

'response.IsSuccessStatusCode'は' true'を返しますか? – Shyju

+0

はい、 'true'を返し、データは' data'変数に渡されますが、 'Assignments'ビューを読み込むときに次のようになります。' InvalidOperationException: 'IEnumerable '型のViewData項目がありません。 key 'EmployeeNumber'.' – Chupacabra

関連する問題