Foreach ViewBag de données donne 'l'objet' ne contient pas une définition pour 'var'

J'ai un contrôleur qui est la construction d'une requête à partir de Linq to Sql pour passer dans le ViewBag.les produits objet. Le problème est, je ne peux pas en boucle à l'aide d'un foreach sur elle comme je l'espérais je le pouvais.

Voici le code dans le contrôleur de la construction de la requête, avec le .ToList() la fonction appliquée.

var products = from bundles in db.Bundle
    join bProducts in db.BundleProducts on bundles.bundleId equals bProducts.bundleID
    join product in db.Products on bProducts.productID equals product.productID
    join images in db.Images on product.productID equals images.productID
    where bundles.bundleInactiveDate > DateTime.Now
          select new {
              product.productName,
              product.productExcerpt,
              images.imageID,
              images.imageURL
           };
ViewBag.products = products.ToList();

Depuis que je suis en utilisant un modèle différent sur l'Index.cshtml pour les autres articles nécessaires, j'ai pensé à un simple code Html.Partielle peut être utilisée pour inclure le viewbag boucle. J'ai essayé avec le même résultat avec et sans l'aide de l'partielle et simplement en utilisant le foreach dans l'index.cshtml. Un extrait de code qui inclut l'partielle est ci-dessous:

<div id="bundle_products">
<!--build out individual product icons/descriptions here--->
@Html.Partial("_homeBundle")
</div>

Dans mon _homeBundle.cshtml fichier j'ai le texte suivant:

@foreach (var item in ViewBag.products)
{ 
    @item
}

Je suis le ViewBag de données, mais j'obtiens l'ensemble de la liste de sortie en tant que tel:

{ productName = Awesomenes Game, productExcerpt = <b>Awesome game dude!</b>, imageID = 13, imageURL = HotWallpapers.me - 008.jpg }{ productName = RPG Strategy Game, productExcerpt = <i>Test product excerpt</i>, imageID = 14, imageURL = HotWallpapers.me - 014.jpg }

Ce que je pensais que je pouvais faire était de:

@foreach(var item in ViewBag.Products)
{
    @item.productName
}

Comme vous pouvez le voir, à la sortie, productName = Awesomenes Jeu. Cependant, je reçois le message d'erreur "objet" ne contient pas une définition pour "productName" quand je cette tentative.

Comment puis-je sortie de chaque "champ" pour ainsi dire individuellement dans ma boucle afin que je puisse demander le bon balises HTML et style nécessaire pour ma page?

Ai-je besoin de faire une toute nouvelle ViewModel pour ce faire, et ensuite créer un modèle d'affichage comme indiqué ici: l '"objet" ne contient pas une définition pour 'X'

Ou je peux faire ce que je cherche ici?

*****Mise à JOUR*****

Dans mon Contrôleur, j'ai maintenant le suivant:

        var bundle = db.Bundle.Where(a => a.bundleInactiveDate > DateTime.Now);
        var products = from bundles in db.Bundle
                       join bProducts in db.BundleProducts on bundles.bundleId equals bProducts.bundleID
                       join product in db.Products on bProducts.productID equals product.productID
                       join images in db.Images on product.productID equals images.productID
                       where bundles.bundleInactiveDate > DateTime.Now
                       select new {
                           product.productName,
                           product.productExcerpt,
                           images.imageID,
                           images.imageURL
                       };
        var bundleContainer = new FullBundleModel();

        bundleContainer.bundleItems = bundle;

        return View(bundleContainer);

J'ai un modèle, FullBundleModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace JustBundleIt.Models
{
    public class FullBundleModel
    {
        public IQueryable<Bundles> bundleItems { get; set; }
        public IQueryable<Images> imageItems { get; set; }
    }
}

et de mon point de Vue a maintenant

@model IEnumerable<JustBundleIt.Models.FullBundleModel>

@foreach (var item in Model) 
{
<div class="hp_bundle">

    <h3>@Html.Display(item.bundleName)</h3>
    </div>
}       

Si je supprime IEnumerable à partir du modèle de référence, le foreach des erreurs qu'il n'y a pas de définition pour un agent recenseur.

Dans le @Html.(Affichage de l'élément.bundleName) les erreurs que le modèle n'a pas de définition pour bundleName. Si je tente

@foreach(var item in Model.bundleItems)

J'obtiens une erreur que bundleItems n'est pas défini dans le modèle.

Donc, ce que n'ai-je pas câblé correctement pour utiliser le modèle combiné?

La première: Ne définissez pas votre Modèle IEnumerable. Utilisez simplement @model JustBundleIt.Models.FullBundleModel. Deuxième: changer votre boucle for pour @foreach(var item in Model.bundleItems) et votre helper HTML pour @Html.DisplayFor(modelItem => item.bundleName).
Je vous remercie. C'est de cette façon je peux dire que j'ai été à elle pendant trop longtemps aujourd'hui. Très apprécié.
lol, pas de problème. Nous avons tous été là. Il ne l'aide pas qu'il y est généralement BEAUCOUP plus d'une façon de faire les choses dans notre monde. Vous pourriez probablement faire face à ce problème de+ de 100 façons différentes et toujours le même résultat final.

OriginalL'auteur SouthPlatte | 2012-09-18