2017-10-18 55 views
0

我試圖使用ViewBag.Unions傳遞數據。我在控制器中獲取數據,但是當我在視圖中foreach循環時,它說'對象'不包含'CountryName'的定義。我從控制器和視圖中提供完整的代碼。我無法解決這個問題。'object'不包含'CountryName'的定義

控制器

public ActionResult Index() 
     { 



      List<Country> listCountry = _db.Countries.ToList(); 
      ViewBag.Countries = listCountry; 

      ViewBag.Unions = (from unon in _db.Unions 
           join upz in _db.Upazilas on unon.UpazilaId equals upz.UpazilaId 
           join dic in _db.Districts on upz.DistrictId equals dic.DistrictId 
           join div in _db.Divisions on dic.DivisionId equals div.DivisionId 
           join con in _db.Countries on div.CountryId equals con.CountryId 

           select new 
           { 
            con.CountryName, 
            div.DivisionName, 
            dic.DistrictName, 
            upz.UpazilaName, 
            unon.UnionName 
           }).ToList(); 

      return View(); 
     } 

查看

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 



<table class=""> 
    <thead> 
     <tr> 
      <td>Country</td> 
      <td>Division</td> 
      <td>District</td> 
      <td>Upazila</td> 
      <td>Union</td> 
     </tr> 
    </thead> 
    <tbody> 
      @if (ViewBag.Unions != null) 
      { 

       foreach (var un in ViewBag.Unions) 
       { 
        <tr> 
         <td>@un.CountryName </td> 
         <td>@un.DivisionName</td> 
         <td>@un.DistrictName</td> 
         <td>@un.UpazilaName</td> 
         <td>@un.UnionName</td> 
        </tr> 
       } 

      } 
     </tbody> 
</table> 

回答

3

由於ViewBag是一個動態的類型的字典。因此,該集合中的每個項目都是動態類型。編譯器跳過類型檢查,當您試圖訪問一個動態類型對象的屬性,但它可能會在運行時失敗(這也正是我避免ViewBag/ViewData的儘可能的原因之一)。

什麼,你應該做,創建一個視圖模型來表示你的LINQ表達

public class MyViewModel 
{ 
    public string CountryName { set;get;} 
    public string DivisionName { set;get;} 
    public string DistrictName { set;get;} 
} 

現在,這個數據和項目,既然你有一個強類型類,你並不真的需要ViewBag到傳遞數據。您可以直接將MyViewModel對象的列表傳遞給視圖。

var items = (from unon in _db.Unions 
        join upz in _db.Upazilas on unon.UpazilaId equals upz.UpazilaId 
        join dic in _db.Districts on upz.DistrictId equals dic.DistrictId 
        join div in _db.Divisions on dic.DivisionId equals div.DivisionId 
        join con in _db.Countries on div.CountryId equals con.CountryId 
       select new MyViewModel 
            { 
             CountryName = con.CountryName, 
             DivisionName = div.DivisionName, 
             DistrictName = dic.DistrictName   
            }).ToList(); 

return View(items); 

現在確保你的看法是強類型的這種集合類型

@model List<MyViewModel> 
<table class="table> 
@foreach(var item in Model) 
{ 
    <tr> 
     <td>@item.CountryName</td> 
     <td>@item.DivisionName</td> 
     <td>@item.DistrictnName</td> 
    </tr> 
} 
</table> 

如果你仍然想使用ViewBag傳遞數據(但爲什麼???),你可以做到這一點。與其將項目列表傳遞給視圖方法,您可以將其設置爲查看包並在剃刀視圖中訪問它。在開始循環收集之前,請務必將其轉換爲列表MyViewModel

ViewBag.Items = items; 
return View(); 

,並在視圖

<table class="table> 
@foreach(var item in ViewBag.Items as List<MyViewModel>) 
{ 
    <tr> 
     <td>@item.CountryName</td> 
     <td>@item.DivisionName</td> 
     <td>@item.DistrictnName</td> 
    </tr> 
} 
</table> 
+0

你的答案是正確的。但我想在ViewBag中使用匿名對象來傳遞數據控制器來查看。 –

+0

是的,你可以使用視圖袋來傳遞數據(與你在原來的職位做了什麼)。你需要轉換ViewBag字典項列出MyViewModel的,這將讓你的智能感知的那些屬性名稱。 – Shyju

相關問題