简体   繁体   中英

MVC5/C#: Pass LINQ inner Join query to view model

i'm trying to pass data(.tolist) in inner join query to viewmodel, to use these data in view that contain also a partial view that needs data from viewModel.

public ActionResult IndexAdmin()
{
    int userId = (int)Session["UserID"];
    userInfo = _context.UserInfo.Find(userId);    

    var AllTours= (from p in _context.PostsInfo  //Why this doesn't return two records
                           join r in _context.Region
                           on p.RegionId equals r.Id
                           where r.CountryId == 1
                           select new
                           {
                              RegionName = r.CountryId,
                              ImageName = p.ImageName,

                           }).Distinct().ToList(); 



//Here i need to define IndexAdminViewModel to populate tours and userInfo.username 

    return View(AllTours);
}

This is the IndexAdminViewModel:

 public class IndexAdminViewModel
 {
    public string UserName { get; set; }
    public string RegionName{get;set;}
    public string ImageName {get;set;}
 }

The view(IndexAdmin.cshtml)

@Html.Partial("_BarPartialAdmin", Model)

foreach (var post in Model)
{
    <img src="~/images/@post.ImageName" alt="QfirstImage">
    <h2>post.RegionName</h2>

}

The partial view will only needs the username to display it for once so i used to pass the model to partial view in order to use the username property, the RegionName and ImageName is a collection so that i can iterate over them and get teh values some way like use them in a table.

My question is how to pass the inner join query results AND theuserinfo.username to viewModel to use them in the view???????

You need to create 2 view models

public class ToursViewModel
{
    public string RegionName { get; set; }
    public string ImageName {get; set; }  
}
public class IndexAdminViewModel
{
    public string UserName { get; set; }
    public IEnumerable<ToursViewModel> Tours {get;set;}
}

Then in the controller

public ActionResult IndexAdmin()
{
    int userId = (int)Session["UserID"];
    userInfo = _context.UserInfo.Find(userId);    

    IEnumerable<ToursViewModel> tours = (
        from p in _context.PostsInfo
        join r in _context.Region
        on p.RegionId equals r.Id
        where r.CountryId == 1
        select new ToursViewModel
        {
            RegionName = r.CountryId,
            ImageName = p.ImageName
        });
    IndexAdminViewModel model = new IndexAdminViewModel
    {
        UserName = userInfo.username,
        Tours = tours
    };
    return View(model);

and in the view

@model IndexAdminViewModel
....
<h1>@Model.UserName</h1>
@foreach (var tour in Model.Tours)
{
    <img src="~/images/@tour.ImageName" alt="QfirstImage">
    <h2>@tour.RegionName</h2>
}

I you need to pass different objects to the view you basically have two options:

  1. Create a composite class and use that as model

     var allTours= from p in _context.PostsInfo //Why this doesn't return two records join r in _context.Region on p.RegionId equals r.Id where r.CountryId == 1 select new PostAndRegion { Region = r.CountryId, Post= p.ImageName, }; var model = new MyCompositeModel { PostsAndRegions = allTours.ToArray(), UserInfo = null // or get from where you want to }; return View(model); 

with

    public class PostAndRegion
    {
        public Post Post{get;set;}
        public Region Region {get;set;}
    }

    public class MyCompositeModel
    {
        public IList<PostAndRegion> PostsAndRegions{get;set;}
        public UserInfo MyUserInfo{get;set;}
    }
  1. Put some of the data in the ViewBag. see http://www.tutorialsteacher.com/mvc/viewbag-in-asp.net-mvc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM