2011-04-13 2 views
0

Je suis un débutant absolu à asp.net et j'ai un problème assez complexe, spécifiquement comment puis-je obtenir les données que je viens de recevoir de la base de données. Voici ma requête et le début de la gestion des données. Je suis habitué à faire des choses avec PHP, pas asp, c'est pourquoi je suis si absolument perplexe. J'ai un appel de base de données précédent qui fonctionne mais je reçois seulement une chose de la base de données alors qu'ici j'essaye d'obtenir plusieurs éléments de la base de données. Je suppose que ma question ici est comment puis-je rendre les données accessibles à ma classe de vue?Comment est-ce que je divise mes données pour que je puisse les afficher?

Merci à tous ceux qui m'aident à ce sujet car je suis sûr que c'est un problème assez basique.

EDIT

est Ci-dessous le message d'erreur que je reçois sur la compilation:

Erreur 1 Impossible de convertir implicitement le type 'System.Collections.Generic.List' à 'System.Collections.Generic.List' C: \ Inetpub \ wwwroot \ HCD \ HCD \ contrôleurs \ HomeController.cs 35 26 HCD

EDIT 2

Juste pour confirmer que je suis en utilisant ASP MVC 2.

EDIT 3

Ceci est mon modèle de vue de l'indice de la marque (mais je vois déjà un problème possible avec elle)

public class BrandIndexViewModel 
{ 
    public List<string> Priority { get; set; } 
    public List<string> FamilyName { get; set; } 
    public List<string> RollImage { get; set; } 
    public List<string> Brands { get; set; } 

} 
+0

Semble ok, est-il donner toute erreur ou tout simplement ne fonctionnent pas? – Andre

Répondre

0

Je vais supposer que vous utilisez ASP.NET MVC.

Pour accéder à la variable de la liste des marques à partir de votre vue, transmettez-la à partir du contrôleur en utilisant le paramètre du modèle. Par exemple:

ActionResult ListAllBrands() 
{ 
    var brandslist = from brand in brandDB.brands 
         join brand_family in brandDB.brand_family 
         on brand.brand_family_id equals 
         brand_family.bf_id 
         orderby brand_family.brand_family_name, 
         brand.priority, 
         brand.genre_id 
         select new 
         { 
          brand_family.brand_family_name, 
          brand.priority, 
          brand.roll_image 
         }; 

    return View("List", brandslist); 
} 

Alors à votre avis, il y aura une variable appelée « modèle » qui contiendra cette valeur. Vous pouvez ensuite parcourir chaque enregistrement du code .ASPX en utilisant une boucle for/each.

2

La racine de votre problème est que votre requête LINQ renvoie un type anonyme, mais que vous affectez à Brands qui est un List<string>. En fin de compte, vous devez obtenir les chaînes que vous voulez. Je vais supposer que "brand_family_name" est les données que vous voulez aller dans le List<string> Brands.

var viewModel = new BrandIndexViewModel{ 
      Brands = brandslist.Select(b => b.brand_family_name).ToList() // Or whichever property you want to use to populate List<string> Brands 
     }; 
+0

Voir aussi l'exemple "DogWithBreed" à http://stackoverflow.com/questions/534690/linq-to-sql-return-anonymous-type –

+0

Merci pour cela. J'ai essayé le premier exemple et il semble fonctionner mieux que le deuxième exemple mais j'ai des erreurs sur la conversion implicite des types d'int (dans le premier cas) et de chaîne (dans les deux autres) à Error System.Collections.Generic .Liste '. – Drew

+0

Si vous pouviez publier la définition de BrandIndexViewModel et de n'importe quel type de liste de marques, il serait utile de faire correspondre les types. –

1

Comme mentionné dans les autres réponses, vous ne spécifiez pas ce que vous voulez dans la liste Brands de votre ViewModel (il serait plus logique d'avoir quelque chose comme brand.Name). L'affichage de vos classes brand et brand_family pourrait clarifier cela. Si je comprends bien, vous avez besoin d'une liste de Brands pour afficher dans votre vue. Dans ce cas, il serait plus propre à un groupe FamilyName, Priority, RollImage et Brand en un seul objet et ont une liste de ceux dans votre ViewModel:

public class BrandIndexViewModel 
{ 
    public List<BrandIndexItem> BrandIndexItems { get; set; } 
} 

public class BrandIndexItem 
{ 
    public string Priority { get; set; } 
    public string FamilyName { get; set; } 
    public string RollImage { get; set; } 
    public string Brand { get; set; } 
} 

Dans ce cas, vous ne devrez pas faire une Select pour pour remplir chaque liste.Au lieu de cela, vous pouvez projeter les résultats de la requête directement sur votre ViewModel. Voici ce que le code devrait ressembler à la jointure:

var viewModel = new BrandIndexViewModel 
        { 
         BrandIndexItems = 
          (from brand in brandDB.brands 
          join brand_family in brandDB.brand_family 
          on brand.brand_family_id equals brand_family.bf_id 
          orderby brand_family.brand_family_name, 
            brand.priority, 
            brand.genre_id 
          select new BrandIndexItem 
          { 
           FamilyName = brand_family.brand_family_name, 
           Priority = brand.priority, 
           RollImage = brand.roll_image, 
           Brands = brand.name // ? 
          }).ToList() 
        }  

De plus, vous mentionnez en utilisant une base de données, mais vous ne mentionnez pas si vous utilisez un ORM tels que EF ou LINQ to SQL. Si vous utilisez l'un d'eux, il serait vraiment utile si vous pouviez poster une capture d'écran de votre modèle. En attendant, selon votre code, il semble que vous ayez une relation un-à-plusieurs entre brand_family et brand, donc si vous utilisez un ORM, vous avez probablement une propriété de navigation brand.brand_family. Dans ce cas, vous aurez pas besoin d'un join dans votre requête LINQ:

var viewModel = new BrandIndexViewModel 
        { 
         BrandIndexItems = 
          (from brand in brandDB.brands 
          orderby brand.brand_family.brand_family_name, 
            brand.priority, 
            brand.genre_id 
          select new BrandIndexItem 
          { 
           FamilyName = brand.brand_family.brand_family_name, 
           Priority = brand.priority, 
           RollImage = brand.roll_image, 
           Brands = brand.name // ? 
          }).ToList() 
        } 
Questions connexes