Reputation:
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
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
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
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