2009-07-28 6 views
1

J'ai un contrôleur qui traite une requête linq en sql par rapport à un modèle de 4 tables.ASP.Net MVC Vue fortement typée avec plusieurs modèles

var files = from f in filesContext.Files 
        join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
        join uir in filesContext.aspnet_UsersInRoles on u.UserId equals uir.UserId 
        join ur in filesContext.aspnet_Roles on uir.RoleId equals ur.RoleId 
        select f; 

Je retourne ensuite la vue en passant des fichiers variables en tant que modèle.

De l'avis J'ai actuellement:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Bailiffs.Models.File>>" 

Ceci est bien jusqu'à ce que je veux accéder aux colonnes d'une autre table à l'exception des fichiers par exemple aspnet_Users ou aspnet_Rols. Je suppose que c'est parce que ma vision ne sait rien de ces modèles. Comment puis-je accéder à ces modèles selon moi?

Répondre

3

Vous ne renvoyez que "f" de la requête, c'est pourquoi vous ne voyez pas le reste.

var files = from f in filesContext.Files 
        join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
        join uir in filesContext.aspnet_UsersInRoles on u.UserId equals uir.UserId 
        join ur in filesContext.aspnet_Roles on uir.RoleId equals ur.RoleId 
        select new { f, u, uir, ur}; 

Vous aurez besoin bien sûr de définir un type nommé (classe) pour maintenir "f", "u", "UIR", "ur".

class FileInfo 
{ 
    public FileType File { get; set; } 
    public UserType User { get; set; } 
    public UserInRoleType UserInRole { get; set; } 
    public UserRoleType UserRole { get; set; } 
} 


var files = from f in filesContext.Files 
        join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
        join uir in filesContext.aspnet_UsersInRoles on u.UserId equals uir.UserId 
        join ur in filesContext.aspnet_Roles on uir.RoleId equals ur.RoleId 
        select new FileInfo { File = f, User = u, UserInRole = uir, UserRole = ur}; 

Alors à votre avis:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Bailiffs.Models.FileInfo>>" 
+0

probablement pas besoin d'une propriété UserInRole puisqu'il sans doute juste une table de jointure. – tvanfosson

+0

@tvanfosson: Oui, ça ressemble à ça. Il peut probablement être supprimé sauf si d'autres informations y sont stockées, comme peut-être l'horodatage d'attribution de rôle ou quelque chose. – User

2

Vous pouvez créer une classe qui contiendra tout ce dont vous avez besoin et transmettre une instance de cette classe à votre vue en tant que modèle.

2

Créer un modèle spécifique à la vue qui détient votre dossier, l'utilisateur et rôle. Sélectionnez-en un nouveau dans votre requête. Définissez ceci comme modèle pour votre ViewPage.

Modèle

public class OwnedFile 
{ 
    File File { get; set; } 
    User User { get; set; } 
    Role Role { get; set; } 
} 

Recherche

var files = from f in filesContext.Files 
       join u in filesContext.aspnet_Users on f.Uploader equals u.UserId 
       join uir in filesContext.aspnet_UsersInRoles on u.UserId equals uir.UserId 
       join ur in filesContext.aspnet_Roles on uir.RoleId equals ur.RoleId 
       select new OwnedFile { File = f, User = u, Role = ur }; 

Voir

Inherits="System.Web.Mvc.ViewPage<IEnumerable<Bailiffs.Models.OwnedFile>>" 
Questions connexes