kolddayz
kolddayz

Reputation:

ASP.Net MVC Strongly Typed View With Multiple Models

I have a controller which peforms a linq to sql query against a model consiting of 4 tables.

 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;

I then return the view passing files variable as the model.

In the view I currently have:

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

This is fine until I want to access columns from any other table except Files e.g. aspnet_Users or aspnet_Rols. I guess this is because my view knows nothing of those models. How can i gain access to those models in my view?

Upvotes: 1

Views: 3964

Answers (3)

tvanfosson
tvanfosson

Reputation: 532435

Create a view-specific model that holds your File, User, and Role. Select a new one of these in your query. Set this as the model for your ViewPage.

Model

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

Query

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 };

View

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

Upvotes: 2

User
User

Reputation: 30945

You're only returning "f" from the query, which is why you don't see the rest.

 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};

You will need of course define a named type (class) to hold "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};

Then in your view:

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

Upvotes: 3

&#199;ağdaş Tekin
&#199;ağdaş Tekin

Reputation: 16651

You could create a class that'll hold everything you need and pass an instance of that class to your view as the model.

Upvotes: 2

Related Questions