我正在尝试使用ViewBag.Unions传递数据。我在控制器上得到数据,但是当我预见循环时,它说'object‘不包含’农村名称‘的定义,我从控制器和视图中给出了完整的代码。我解决不了这个问题。
控制器
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> 发布于 2017-10-18 17:15:19
因为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>https://stackoverflow.com/questions/46815448
复制相似问题