【问题标题】:Possible to retrieve data from viewbag with where condition可以从带有 where 条件的 viewbag 中检索数据
【发布时间】:2017-09-25 05:59:23
【问题描述】:

我正在尝试根据属性 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>
}

我想根据PropertyIDViewBag.tblProperty 获取图像,从ViewBag.tblImages 检索图像。

我该怎么做?

【问题讨论】:

  • 这似乎是对ViewBag 的滥用。 DataTables 不是强类型的,最重要的是,您将它们分配给 ViewBag。将Datatable 转换为控制器中的列表,然后在视图中使用它们。

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


【解决方案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 类并分配给它。互联网上有大量关于此的示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2015-01-19
  • 1970-01-01
  • 2018-02-10
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多