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é?
@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
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas créer un nouveau modèle qui contient toutes les données dont vous avez besoin?
Un Exemple:
Ce qui vous permettra d'accéder à vos requêtes de Rasoir:
Personnellement, je éviter d'utiliser ViewBag à tous et stocker tout ce dont j'ai besoin dans de tels modèles, car il n'est PAS dynamique et les forces de tout être fortement typé. Je crois aussi que cela vous donne une structure bien définie/intention.
Et juste par souci de clarté:
Exemple Deux:
Dans ce cas, vous avez stocké les 3 autres éléments dans le modèle avec votre 2 requêtes. Vous pouvez utiliser le code Html des aides pour créer une Liste Déroulante dans de Rasoir:
Et vous pouvez utiliser la méthode displayfor de l'aide pour afficher vos dates de tel que défini dans votre modèle avec des Annotations de Données:
Ceci est avantageux de l'OMI, car il vous permet de définir toutes les données que vous souhaitez utiliser dans votre point de Vue ET comment vous prévoyez de format de données en un seul endroit. Votre Contrôleur contient toute la logique métier, votre Modèle contient toutes les données de mise en forme, et votre point de Vue ne concerne que le contenu de votre page.
Je ne dirais pas ça. Votre Modèle peut contenir tout ce que vous souhaitez. J'ai mis tout ce que j'ai besoin d'un point de Vue particulier dans un Modèle. Je vais ajouter un exemple dans un instant.
Ajouté deuxième exemple avec plus de requêtes.
Merci. Toujours avoir quelques problèmes. Je peut mettre à jour avec ce que j'ai fait pour clarifier ma tentative à votre exemple.
OriginalL'auteur Kittoes0124
Darin réponse que vous avez lié les états la notion importante: Les types anonymes ne sont pas conçus pour une utilisation à travers les frontières de l'assemblée et indisponible pour Rasoir. Je voudrais ajouter que c'est rarement une bonne idée d'exposer des objets anonymes en dehors de leur contexte immédiat.
La création d'un modèle de vue spécifiquement pour afficher la consommation est presque toujours la bonne approche. Afficher les modèles peuvent être réutilisées dans des vues si vous présentez des données similaires.
Il n'est pas nécessaire de créer un modèle d'affichage, mais il peut être utile si vous souhaitez réutiliser la logique d'affichage. HTML helpers peuvent également remplir une fonction similaire de fournir réutilisables logique d'affichage.
Ayant dit tout cela, il n'est pas impossible de passer d'un type anonyme à vue, ou à lire un type anonyme. Un
RouteValueDictionary
peut prendre un type anonyme (même à travers des assemblées) et la lecture de ses propriétés. La réflexion permet de lire les membres, indépendamment de la visibilité. Tout cela a de ses usages, le passage des données d'un point de Vue est pas l'un d'eux.Plus de lecture:
OriginalL'auteur Tim Medora