我正在尝试根据属性ID检索图像。
我正在做的是将所有属性文本数据放在一个视图包中ViewBag.tblProperty
,我正在检索另一个视图包中的所有图像为ViewBag.tblImages
。
这是我的代码:
@foreach (System.Data.DataRow dr in ViewBag.tblProperty.Rows)
{
<ul class="popup-gallery-@dr["PropertyID"] bxslider-@dr["PropertyID"]">
@foreach (System.Data.DataRow dr in ViewBag.tblimages.where(@dr["PropertyID"]).Rows)
{
<li><a href="@dr["FileName"]"><img src="@dr["FileName"]" /></a></li>
}
</ul>
}
我想根据ViewBag.tblImages
来自PropertyID
来检索ViewBag.tblProperty
中的图片。
我该怎么办?
答案 0 :(得分:1)
ViewBag是将项目存储为动态类型的字典。因此,您需要先将其转换为DataTable
并使用AsEnumerable
方法将数据表转换为匿名对象列表,以后可以使用Where
子句
假设您的tblImages具有Id
,FileName
和ParentId
属性
@{
var imgsDt = ViewBag.tblimages as DataTable;
var imageList = imgsDt.AsEnumerable().Select(t => new
{
Id = t.Field<int>("Id"),
FileName= t.Field<string>("FileName"),
ParentId = t.Field<int>("ParentId"),
}).ToList();
}
@foreach (var dr in ViewBag.tblProperty.Rows)
{
var id = (int) dr["Id"];
<div>
<span>@dr["Name"]</span>
@foreach (var imgItem in imageList.Where(d=>d.ParentId== id))
{
<div>@imgItem.FileName</div>
}
</div>
}
您需要将@using System.Data
添加到视图的顶部。
为简单起见,我更新了标记,只是在div中打印名称/属性值。您可以将该部分更新为您的标记(ul-li)
虽然这可能会解决问题,但我强烈建议您不要将DataTables与ViewBag一起使用来传输数据。代码很难维护。我建议您创建一个视图模型类,并将数据加载到操作方法中的视图模型,并将视图模型发送到视图。这样你的视图就不会知道你正在使用什么类型的数据访问,它将非常干净和可读。
如果您要编写自定义ado.net代码,则可以使用SqlDataReader
。创建一个代表您的实体的POCO类并分配给它。互联网上有大量的样本。