Ron
Ron

Reputation: 1731

Help with displaying master detail data into mvc3 view

I have the following models:

public class Page
    {
        public int PageID { get; set; }
        public string Name { get; set; }
        public string Content { get; set; }
        public DateTime? DateCreated { get; set; }
        public bool IsPublished { get; set; }
        public string ModifiedBy { get; set; }
        public DateTime? DateModified { get; set; }

        public int UserID { get; set; }
        public int CategoryID { get; set; }

        public virtual User User { get; set; }
        public virtual Category Category { get; set; }
    }

public class Category
    {
        public int CategoryID { get; set; }

        [Required(ErrorMessage = "Category name is required.")]
        [Display(Name = "Category Name")]
        public string Name { get; set; }

        public virtual ICollection<Page> Pages { get; set; }

    }

and I want to populate this navigation list:

<div id="centeredmenu" class="nav-border nav-color">
    <ul>
    @foreach (var pages in Model)
    {
        <li>CATEGORY NAME GOES HERE
            <ul>
               @foreach (var pages in Model)
               {
                <li>PAGE NAMES GO HERE</li>
                }
            </ul>
        </li>
    }
    </ul>
</div>

but I'm having problems implementing the controller. I tried this ViewModel:

public class MainPageModels
    {
        public Category Categories { get; set; }
        public Page Pages { get; set; }
    }

but it just confused me even more with this error message:

System.Data.Edm.EdmEntityType: : EntityType 'MainPageModels' has no key defined. Define the key for this EntityType. System.Data.Edm.EdmEntitySet: EntityType: EntitySet �MainModels� is based on type �MainPageModels� that has no keys defined.

This is my controller:

public ActionResult Index()
        {
            var pages = db.MainModels.Select(p => p.Pages).Select(c => c.Category);
            return View(pages);
        }

I may be missing something simple here.

Upvotes: 0

Views: 1937

Answers (2)

Ron
Ron

Reputation: 1731

Here my solution to my parent-child list problem:

I created a ViewModel to house both my categories and pages:

public class HomeViewModels 
    {
        [Key]
        public int HomeViewKey { get; set; } //This is a MUST! 
        public IEnumerable<Category> ViewCategories { get; set; }
        public IEnumerable<Page> ViewPages { get; set; }

        public void CreateHomeViewModel(IEnumerable<Category> categories,
                                        IEnumerable<Page> pages)
        {
            this.ViewCategories = categories;
            this.ViewPages = pages;
        }        
    }

Then edited my controller to populate the viewmodel:

public ActionResult Index()
        {
            HomeViewModels homePages = new HomeViewModels();
            homePages.CreateHomeViewModel(db.Categories.ToList(),
                                          db.Pages.ToList());
            return View(homePages);
        }

and finally creating the ul-li lists with the following:

@{var hvCategories = Model.ViewCategories;}
@foreach (var categories in hvCategories)
    {
        <li>@Html.ActionLink(categories.Name, "Index", "Home")
            <ul>
                @{var hvPages = Model.ViewPages
                                .Where(p => p.CategoryID == categories.CategoryID);}
                @foreach (var pages in hvPages)
                {
                    <li>@Html.ActionLink(pages.Name, "Index", "Home")</li>
                }
            </ul>
    </li>

I hope this helps anyone who plans to build a nested list using a parent-child model. This took me two days to figure out. Cheers!

Upvotes: 1

Pieter Germishuys
Pieter Germishuys

Reputation: 4886

Posting this here for the code/syntax

public class Person
{ 
   [Key]
   public int PersonID { get; set; }
   public string Name { get; set; }
   public string LastName { get; set; }
}
public class DataContext : DbContext
{
    EntitySet<Person> Persons { get; set; }
}

Your View Model can then do the following

public class PersonAddViewModel
{
   public string Name { get; set; }
   public string LastName { get; set; }

   public void CreateViewModelFromDataModel(Person person)
   {
      this.Name = person.Name;
      this.LastName = person.LastName ;
   }
}

This is just an example, just to show the difference between a Data Model and a View Model Your View would then be a strongly typed view of PersonAddViewModel

Upvotes: 2

Related Questions