2017-10-18 54 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

相关问题