【问题标题】:'object' does not contain a definition for 'CountryName'“object”不包含“CountryName”的定义
【发布时间】:2018-03-30 15:19:53
【问题描述】:

我正在尝试使用 ViewBag.Unions 传递数据。我在控制器处获取数据,但是当我在视图中进行 foreach 循环时,它说“对象”不包含“国家名称”的定义。我给出了控制器和视图的完整代码。我无法解决这个问题。

控制器

 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> 

【问题讨论】:

    标签: c# asp.net-mvc linq


    【解决方案1】:

    因为 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>
    

    【讨论】:

    • 你的答案是正确的。但我想在 ViewBag 中使用匿名对象将数据控制器传递给查看。
    • 是的,您可以使用视图包来传递数据(与您在原始帖子中所做的相同)。您需要将 ViewBag 字典项转换为 MyViewModel 列表,这将为您提供这些属性名称的智能感知。
    猜你喜欢
    • 2014-09-09
    • 2016-01-24
    • 1970-01-01
    • 2021-11-29
    • 2018-05-28
    • 2020-12-31
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多