Multiple models in a view

前端 未结 12 1843
太阳男子
太阳男子 2020-11-21 23:07

I want to have 2 models in one view. The page contains both LoginViewModel and RegisterViewModel.

e.g.

pub         


        
12条回答
  •  悲&欢浪女
    2020-11-21 23:27

    I want to say that my solution was like the answer provided on this stackoverflow page: ASP.NET MVC 4, multiple models in one view?

    However, in my case, the linq query they used in their Controller did not work for me.

    This is said query:

    var viewModels = 
            (from e in db.Engineers
             select new MyViewModel
             {
                 Engineer = e,
                 Elements = e.Elements,
             })
            .ToList();
    

    Consequently, "in your view just specify that you're using a collection of view models" did not work for me either.

    However, a slight variation on that solution did work for me. Here is my solution in case this helps anyone.

    Here is my view model in which I know I will have just one team but that team may have multiple boards (and I have a ViewModels folder within my Models folder btw, hence the namespace):

    namespace TaskBoard.Models.ViewModels
    {
        public class TeamBoards
        {
            public Team Team { get; set; }
            public List Boards { get; set; }
        }
    }
    

    Now this is my controller. This is the most significant difference from the solution in the link referenced above. I build out the ViewModel to send to the view differently.

    public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                TeamBoards teamBoards = new TeamBoards();
                teamBoards.Boards = (from b in db.Boards
                                     where b.TeamId == id
                                     select b).ToList();
                teamBoards.Team = (from t in db.Teams
                                   where t.TeamId == id
                                   select t).FirstOrDefault();
    
                if (teamBoards == null)
                {
                    return HttpNotFound();
                }
                return View(teamBoards);
            }
    

    Then in my view I do not specify it as a list. I just do "@model TaskBoard.Models.ViewModels.TeamBoards" Then I only need a for each when I iterate over the Team's boards. Here is my view:

    @model TaskBoard.Models.ViewModels.TeamBoards
    
    @{
        ViewBag.Title = "Details";
    }
    
    

    Details

    Team


    @Html.ActionLink("Create New Board", "Create", "Board", new { TeamId = @Model.Team.TeamId}, null)
    @Html.DisplayNameFor(model => Model.Team.Name)
    @Html.DisplayFor(model => Model.Team.Name)
      @foreach(var board in Model.Boards) {
    • @Html.DisplayFor(model => board.BoardName)
    • }

    @Html.ActionLink("Edit", "Edit", new { id = Model.Team.TeamId }) | @Html.ActionLink("Back to List", "Index")

    I am fairly new to ASP.NET MVC so it took me a little while to figure this out. So, I hope this post helps someone figure it out for their project in a shorter timeframe. :-)

提交回复
热议问题