ViewBag est un dictionnaire qui stocke des éléments en tant que type dynamique. Donc, vous devez d'abord convertir en un DataTable
et peut utiliser la méthode AsEnumerable
pour convertir votre table de données à une liste d'objets anonymes que vous pouvez utiliser plus tard avec une clause Where
En supposant que votre tblImages a un Id
, FileName
et ParentId
propriétés
@{
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>
}
Vous devez ajouter @using System.Data
en haut de votre point de vue. Par souci de simplicité, j'ai mis à jour le balisage pour imprimer simplement les valeurs nom/propriété à l'intérieur d'un div. Vous pouvez mettre à jour cette partie à votre balisage (ul-li)
Bien que cela puisse résoudre le problème, je vous recommande fortement de ne pas utiliser DataTables avec ViewBag pour transférer des données. Le code va être difficile à maintenir. Je vous suggère de créer une classe de modèle de vue et de charger les données dans le modèle de vue dans votre méthode d'action et d'envoyer le modèle de vue à la vue. De cette façon, votre vue n'aura aucune idée du type d'accès aux données que vous utilisez et elle sera très propre et lisible. Vous pouvez utiliser SqlDataReader
si vous écrivez du code ado.net personnalisé. Créez une classe POCO représentant vos entités et attribuez-y. Il y a des tonnes d'échantillons sur internet à ce sujet.
Cela ressemble à un abus de 'ViewBag'. 'DataTables' n'est pas fortement typé, et en plus, vous les affectez à' ViewBag'. Convertissez le 'Datatable' en une liste dans le contrôleur, puis utilisez-les dans la vue. – adiga