可以使用 where 条件从 viewbag 检索数据

Possible to retrieve data from viewbag with where condition

我正在尝试根据 属性 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.tblProperty 获得的 PropertyIDViewBag.tblImages 检索图像。

我该怎么做?

ViewBag 是将项目存储为动态类型的字典。因此,您需要先将其转换为 DataTable,然后可以使用 AsEnumerable 方法将数据 table 转换为匿名对象列表,稍后您可以将其与 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 中打印 name/property 值。您可以将该部分更新为您的标记 (ul-li)

虽然这可能会解决问题,但我强烈建议您不要将 DataTables 与 ViewBag 一起使用来传输数据。代码将很难维护。我建议您创建一个视图模型 class 并在您的操作方法中将数据加载到视图模型并将视图模型发送到视图。这样您的视图就不会知道您正在使用哪种数据访问,并且它会非常干净和可读。

如果您正在编写自定义 ado.net 代码,则可以使用 SqlDataReader。创建一个代表您的实体的 POCO class 并分配给它。互联网上有大量关于此的样本。