可以从具有条件的viewbag检索数据

时间:2017-09-24 13:32:52

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-3

我正在尝试根据属性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中的图片。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

ViewBag是将项目存储为动态类型的字典。因此,您需要先将其转换为DataTable并使用AsEnumerable方法将数据表转换为匿名对象列表,以后可以使用Where子句

假设您的tblImages具有IdFileNameParentId属性

@{
    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类并分配给它。互联网上有大量的样本。