2011-02-04 4 views
1

Hey, je suis nouveau à asp et je voudrais vous demander de l'aide. J'ai construit un magasin avec l'aide du tutoriel MvcMusicStore. Maintenant, je veux ajouter une vue pour gérer les commandes qui affichera juste OrderID (en vue Index), puis plus d'infos dans la vue Détails. Infos viendra de la table qui ressemble à ceci:MVC, afficher afficher les données

Lorsque je liste OrderID, la multiplication parce que chaque produit crée nouveau record avec le même OrderID dans le tableau. Est-il possible d'afficher chaque ID une seule fois?

Puis j'ai essayé d'afficher plus d'informations dans Detaild View mais j'ai échoué à nouveau. J'ai utilisé ce code dans le contrôleur:

 public ActionResult Details(int id) 
    { 
     var orderdetail = storeDB.OrderDetails.Single(a => a.Order.OrderId == id); 
     return View(orderdetail); 
    } 

mais évidemment cela ne fonctionnera pas car un seul élément peut être affiché. J'ai également essayé avec la boucle de foreach dans Details.aspx mais j'obtenais une erreur liée à IEnumerables. Tout conseil est le bienvenu, désolé pour la question de débutant et mauvais anglais. Je vous remercie.

Edit: Voici le code de contrôleur pour Voir Index (produit dans ma table est égal album tutoriel):

 public ActionResult Index() 
    { 
     var manageorders = storeDB.OrderDetails 
     .Include("Product").Include("Order") 
     .ToList(); 
     return View(manageorders); 
    } 

Voir les détails et le code:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MasterPage.Master" Inherits="System.Web.Mvc.ViewPage<ss.Models.OrderDetail>" %> 

Index

<div id="style3">manage orders</div> 
<div id="style1"> 
<table> 
    <tr> 
     <th></th> 
     <th> 
     user 
     </th> 
     <th> 
     data 
     </th> 
     <th> 
     product 
     </th> 
     <th> 
     quantity 
     </th> 

    </tr> 

<% foreach (var item in Model) { %> 

    <tr> 
     <td> 
      <%: Html.ActionLink("Edit", "Edit", new { id=item.Order.OrderId }) %> | 
      <%: Html.ActionLink("Details", "Delete", new { id=item.Order.OrderId })%> 
     </td> 
     <td> 
      <%: item.Order.Username %> 
     </td> 
        <td> 
      <%: item.Order.OrderDate %> 
     </td> 
     <td> 
      <%: item.Quantity %> 
     </td> 
        <td> 
      <%: item.Quantity %> 
     </td> 
    </tr> 

<% } %> 

<p> 
    <%: Html.ActionLink("Create New", "Create") %> 
</p> 

Et erreur Je RECEVOIR:

Compiler Error Message: CS1579: foreach statement cannot operate on variables of type 'ss.Models.OrderDetail' because 'ss.Models.OrderDetail' does not contain a public definition for 'GetEnumerator'

+0

Pouvez-vous poster le code de votre vue (l'ASPX)? Cela pourrait nous aider à diagnostiquer l'erreur IEnumerable que vous voyez. – JMP

+0

avez-vous un lien vers ce tutoriel? – Spooks

+0

@Spooks - Ce serait le MusicStore ASP.Net à http://www.asp.net/mvc/tutorials/mvc-music-store-part-1 – RichardW1001

Répondre

0

Single() lèveront une exception s'il élément est plus de 1 dans la séquence, de sorte que l'erreur est ici parce que chaque Order peut avoir plusieurs OrderDetails (c'est votre erreur IEnumerable-ish). Si vous voulez sélectionner la première correspondance, quand il y en a plusieurs, utilisez la méthode First(), qui ne sera pas lancée s'il y en a plusieurs.

Cela dépend vraiment de ce que votre contrôleur fonctionne - Commandes ou OrderDetails. Ce serait la différence entre Orders/Details/1 et OrderDetails/Details/1, où le premier serait axé sur l'ensemble de la commande et tous ses détails, et le second serait sur une ligne spécifique.

Si vous vouliez travailler avec la commande - ce à quoi vous vous attendez - vous auriez besoin d'une référence quelconque de l'Ordre à sa collection de OrderDetails. Si vous utilisez quelque chose comme Entity Framework comme dans le didacticiel MusicStore, vous obtiendrez cette collection dans le cadre de votre modèle d'entité. Vous passeriez l'Ordre à la vue, et pourriez ensuite accéder à la collection OrderDetails dans un pour chaque boucle ou similaire, par exemple.

public ActionResult details(int id) 
{ 
    Order viewModel = storeDb.Orders.Single(o => o.Id = id); 
    return View(viewModel); 
} 

Ce ne serait pas jeter si Id est unique par ordre, car il n'y a qu'une seule (pas beaucoup).Votre point de vue pourrait alors avoir quelque chose comme:

<ul> 
<% foreach (OrderDetails od in Model.OrderDetails) { %> 
    <li><%: od.UnitPrice %> (Or whatever information you wanted to show) </li> 
<% } %> 
</ul> 

Je suppose que vous voulez utiliser une vue fortement typé de l'ordre de type, sinon vous auriez à travailler avec ViewData, mais il semble de votre question comme vous » re heureux avec ces concepts déjà.

Edition - ajouter plus ...

1. frappe de votre page vous cause des problèmes, assurez-vous que vous êtes clair dans votre esprit exactement ce que votre modèle est. Si vous passez une liste - comme vous le feriez dans une action Index - vous avez besoin d'une page qui hérite de ViewPage> (vous pouvez le voir dans la déclaration <% @ Page%> en haut de la page). Si vous allez écrire du code comme "pour chaque ... dans le modèle", cela impliquera que votre modèle doit contenir plus d'une chose. C'est de là que provient votre message d'erreur "GetEnumerator". Votre vue, telle que postée, hérite de ViewPage, c'est-à-dire que le modèle est un objet unique et non une collection d'objets, et donc "pour chaque ... dans le modèle" n'a pas de sens. Le type de votre View doit être le même que celui transmis par votre contrôleur. Votre méthode Index transmet une liste et List est un exemple d'IEnumerable. Vos coordonnées passent cependant un seul YourModelClass. 2.Le message d'erreur "Message d'erreur du compilateur: CS1061: 'ss.Models.OrderDetail' ne contient pas de définition pour 'OrderDetails'" - vérifiez votre modèle, s'il existe des relations (clés étrangères, etc.) entre vos tables , ils devraient être joints sur le diagramme du modèle, et vous auriez normalement aussi des propriétés de navigation. Le fait que vous receviez ce message signifie que quelque chose n'est pas là.

3. Je vous suggère de vérifier quelques-unes des vidéos, car les explications sont assez pratiques. Essayez quelques-unes des vidéos au http://www.asp.net/mvc/fundamentals. La série «Pour le reste d'entre nous» de Joe Stagner est très bonne, et comme point de départ, «Créer une application BD de Stephen Walther» aiderait, car il montre ce genre de chose.

+0

Merci pour votre réponse. J'ai besoin de prendre des données à partir de 3 tables dans la vue Details: Order, OrderDetails and Product. J'ai besoin d'afficher DetailId dans Index.aspx et les données de ces 3 tables dans Details.aspx. J'ai essayé d'utiliser la boucle que vous avez présentée mais VS a souligné OrderDetails dans la partie Model.OrderDetails et j'ai reçu l'erreur: Message d'erreur du compilateur: CS1061: 'ss.Models.OrderDetail' ne contient pas de définition pour 'OrderDetails' et aucune méthode d'extension 'OrderDetails' accepter un premier argument de type 'ss.Models.OrderDetail' peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) – darx

+0

Ok, dans ce cas, vous devez fournir plus d'informations sur votre modèle. Je supposais que vous utilisiez Entity Framework comme dans le tutoriel, ce qui signifie normalement que vous avez des propriétés de collection que vous pouvez utiliser. Il y a beaucoup d'autres choses qui se passent dans votre exemple, donc je vais le poster comme un edit pour cette réponse. – RichardW1001

+0

Oui, j'utilisais Entity Framework et je n'ai pas vraiment changé beaucoup de choses dans le projet. Je dirais que j'ai seulement changé 3 noms de table et ses colonnes pour répondre à mes besoins. Donc, fondamentalement, il n'y a pas d'album mais de produit, pas d'artiste mais de marque et de catégorie plutôt que de genre. Peut-être que j'écrirai ce que j'essaie de faire en me basant sur le tutoriel. Il s'agirait d'une vue index affichant OrderId et de détails indiquant l'album, l'artiste, la quantité, le prix, l'adresse et la ville. J'essayais d'obtenir de l'aide sur le forum officiel, mais il semble être mort. Merci pour votre temps! – darx

Questions connexes