2011-07-01 5 views
0

Je crée mon premier site Web ASP.NET MVC 3 pour l'intranet de mon entreprise. C'est un peu cool, je joue de l'audio enregistré par notre système téléphonique et enregistré dans notre db. Cela fonctionne bien, mais j'ai du mal à trouver comment faire quelque chose qui devrait être simple. S'il vous plaît pardonner toutes les erreurs de syntaxe que j'ai probablement, c'est un brouillon. J'ai une table dans la vue Index/Apps qui liste tous les AppName, et à côté de chaque AppName je veux afficher un lien vers une autre vue, avec le texte du lien étant un Count() de tous les CallDetails associés avec cette application.Problème de lien dynamique dans un site Web MVC 3

J'ai deux classes:

public class Apps 
{ 
    public int AppId { get; set; } 
    public string AppName { get; set; } 
} 

public class CallDetail 
{ 
    public int Id { get; set; } 
    public int AppID { get; set; } 
    public byte[] FirstName { get; set; } 
    public byte[] LastName { get; set; } 
    ....etc 
} 

un contexte pour chaque:

public class AppsContext : DbContext 
{ 
    public DbSet<Apps> Apps { get; set; } 
} 

public class CallContext : DbContext 
{ 
    public DbSet<CallDetail> CallDetails { get; set; } 
} 

une méthode de commande pour chaque:

// AppsController 
private AppsContext db = new AppsContext(); 

public ViewResult Index() 
{ 
    return View(db.Apps.ToList()); 
} 
// CallController method (from my current attempt) 
public ActionResult CallCheck(int id) 
{ 
    bool? enabled = null; 

    var appcalls = from s in db.CallDetails 
        where s.AppID == id 
        && s.Enabled.Equals(enabled) 
        select s; 

    string callnum = appcalls.Count().ToString(); 

    return View(callnum); 
} 

Il affiche le AppName très bien dans cette partie de la vue ci-dessous, et je peux très bien créer un lien vers une vue pour chaque CallDetail associé. Mais je ne sais pas comment afficher les informations que je recevrais du contrôleur CallDetail puisque le modèle de View est Apps et son contrôleur, AppsController.

@model IEnumerable<myMessagePlayer.Models.Apps> 
... 
@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.AppName) 
     </td> 
     <td class="appLink"> 
      ... 
     </td> 
    </tr> 
} 

J'ai essayé de nombreuses méthodes différentes, certains que je pourrais avoir appris à travailler, mais ils semblaient sémantiquement un MVC. Alors je me suis dit que je demanderais à un général "quelle est la pratique standard?" type de question.

Répondre

1

Le chemin que vous êtes en train de descendre finira par atteindre la base de données pour chaque application que vous avez dans votre base de données. Il existe un moyen d'afficher toutes les informations avec un seul hit dans la base de données.

Votre contexte doit changer à ceci:

public class ApplicationContext : DbContext 
{ 
    public DbSet<Apps> Apps { get; set; } 
    public DbSet<CallDetail> CallDetails { get; set; } 
} 

Vous pouvez créer un objet modèle de vue appelé AppCallInfo qui a trois propriétés:

public class AppCallInfo 
{ 
    public int AppID { get; set; } 
    public string AppName { get; set; } 
    public int CallCount { get; set; } 
} 

Dans votre action Index vous devez faire quelque chose comme ceci:

public ViewResult Index() 
{ 
    var model = from a in db.Apps 
       join c in db.CallDetails on a.AppID equals c.AppID 
       where c.Enabled == enabled 
       group a by new { AppName = a.AppName, AppID = a.AppID } into g 
       select new AppCallInfo { 
        AppName = g.Key.AppName, 
        AppID = g.Key.AppID, 
        CallCount = g.Count() 
       }; 

    return View(model.ToList()); 
} 

Maintenant vous avez tout ce dont vous avez besoin pour chaque rangée dans yo ur table dans un objet. Cette méthode évite de cliquer sur la base de données pour chaque application que vous avez dans votre tableau.

+0

J'ai commencé à faire quelque chose comme ça hier soir, mais je ne savais pas si ça marcherait ou si c'était "comment les choses sont faites". Je n'ai pas vu beaucoup d'exemples à construire. Donc, je garderais mes méthodes de contexte identiques pour Apps et CallDetails? –

+1

En fait, votre contexte devra changer pour inclure les deux objets. (Ajout de ce changement à ma réponse). C'est la bonne façon de faire les choses. Vous pouvez voir des exemples de ceci sur le blog de ScottGu à http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx –

+0

Merci, je suis Je vais donner un coup de feu. –

0

La vue CallCheck est-elle une vue partielle?

À votre avis d'index que vous pouvez utiliser

@Html.RenderAction("CallCheck", "AppsController", new { Id = @Model.AppId }) 

La syntaxe peut ne pas être correct à 100%, mais il devrait vous aider à aller dans la bonne direction.

Questions connexes