首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘'object’不包含'CountryName‘的定义

‘'object’不包含'CountryName‘的定义
EN

Stack Overflow用户
提问于 2017-10-18 16:57:42
回答 1查看 62关注 0票数 0

我正在尝试使用ViewBag.Unions传递数据。我在控制器上得到数据,但是当我预见循环时,它说'object‘不包含’农村名称‘的定义,我从控制器和视图中给出了完整的代码。我解决不了这个问题。

控制器

代码语言:javascript
复制
 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();
        }

视图

代码语言:javascript
复制
@{
    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> 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-18 17:15:19

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

您应该做的是,创建一个视图模型来表示此数据,并将项目表示为LINQ表达式中的数据和项目。

代码语言:javascript
复制
public class MyViewModel
{
  public string CountryName { set;get;}
  public string DivisionName  { set;get;}
  public string DistrictName { set;get;}
}

现在,由于您有一个强类型的类,所以实际上不需要ViewBag来传递数据。可以将MyViewModel对象的列表直接传递给视图。

代码语言:javascript
复制
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);

现在,请确保视图强类型为此集合类型。

代码语言:javascript
复制
@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

代码语言:javascript
复制
ViewBag.Items = items;
return View();

在视野中

代码语言:javascript
复制
<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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46815448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档