代码之家  ›  专栏  ›  技术社区  ›  Aminur Rahman

“object”不包含“CountryName”的定义

  •  0
  • Aminur Rahman  · 技术社区  · 8 年前

    我正在尝试使用ViewBag传递数据。工会。我在控制器上获取数据,但当我在视图中foreach循环时,它表示“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> 
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Shyju    8 年前

    因为ViewBag是一个动态类型字典。因此,该集合中的每个项目都是动态类型。当您尝试访问动态类型对象的属性时,编译器会跳过类型检查,但在运行时可能会失败( 这正是我尽量避免使用ViewBag/ViewData的原因之一 ).

    您应该做的是,创建一个视图模型来表示此数据,并将其投影到LINQ表达式中

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

    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传递数据(但为什么?),你可以做到的。您可以将其设置为view bag,并在razor视图中访问它,而不是将项目列表传递给view方法。确保将其转换为列表 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>