2017-09-24 16 views
0

J'essaie de récupérer des images sur la base de l'ID de propriété. Ce que je fais est d'obtenir toutes les données de texte de propriété dans un sac de vue dit ViewBag.tblProperty et je récupère toutes les images dans un autre viewbag comme ViewBag.tblImages.Possibilité d'extraire des données de viewbag avec la condition where

Ceci est mon code:

@foreach (System.Data.DataRow dr in ViewBag.tblProperty.Rows) 
{  
    <ul class="[email protected]["PropertyID"] [email protected]["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> 
} 

Je veux récupérer des images de ViewBag.tblImages sur la base de PropertyID obtenir de ViewBag.tblProperty.

Comment puis-je le faire?

+1

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

Répondre

1

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.

+0

Vous devez également ajouter 'using System.Data' – adiga

+0

Voici un exemple d'article sur l'obtention de données via DataReader et la classe personnalisée POCO https://stackoverflow.com/questions/37092862/how-to-iterate-data-from-dwo -columns-dans-unique-select-box-dans-asp-net-mvc/37093256 # 37093256 (Juste la première partie) – Shyju

+0

pouvez-vous expliquer comment passer le modèle de vue comme un exemple –