Asp.net mvc 帮助将主详细信息数据显示到mvc3视图中

Asp.net mvc 帮助将主详细信息数据显示到mvc3视图中,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我有以下型号: 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 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; }

    }
但这让我更困惑的是这个错误信息:

System.Data.Edm.EdmEntityType::EntityType“MainPageModels”未定义键。定义此EntityType的键。 System.Data.Edm.EdmentySet:EntityType:EntitySet�主要型号� 是基于类型的�主页模型� 没有定义键的

这是我的控制器:

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

我可能错过了一些简单的东西

在此处发布此代码/语法

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; }
}
这只是一个示例,只是为了说明数据模型和视图模型之间的区别
然后,您的视图将是PersonAddViewModel的强类型视图

在此处发布此视图以获取代码/语法

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; }
}
这只是一个示例,只是为了说明数据模型和视图模型之间的区别
然后,您的视图将是PersonAddViewModel的强类型视图

这里是我的父子列表问题的解决方案:

我创建了一个ViewModel来容纳我的类别和页面:

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;
        }        
    }
最后,使用以下内容创建ul li列表:

@{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>
@{var hvCategories=Model.ViewCategories;}
@foreach(hvCategories中的var类别)
{
  • @ActionLink(categories.Name,“Index”,“Home”)
      @{var hvPages=Model.ViewPages .Where(p=>p.CategoryID==categories.CategoryID);} @foreach(hvPages中的var页面) {
    • @ActionLink(pages.Name,“Index”,“Home”)
    • }

  • 我希望这能帮助那些计划使用父子模型构建嵌套列表的人。这花了我两天的时间才弄明白。干杯!

    这里是我解决父子列表问题的方法:

    我创建了一个ViewModel来容纳我的类别和页面:

    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;
            }        
        }
    
    最后,使用以下内容创建ul li列表:

    @{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>
    
    @{var hvCategories=Model.ViewCategories;}
    @foreach(hvCategories中的var类别)
    {
    
  • @ActionLink(categories.Name,“Index”,“Home”)
      @{var hvPages=Model.ViewPages .Where(p=>p.CategoryID==categories.CategoryID);} @foreach(hvPages中的var页面) {
    • @ActionLink(pages.Name,“Index”,“Home”)
    • }

  • 我希望这能帮助那些计划使用父子模型构建嵌套列表的人。我花了两天时间才弄明白。干杯!

    从你的帖子中可以看出,你已经指定了一个类型为MainModels的EntitySet,如果你想这样做,你需要指定一个键或某种id。MainModel类中的键?我已经浏览了好几个t我是一个mvc3 noob。MVC中通常使用两种类型,模型通常指从数据库获取数据的对象,或者可能是您的域模型。然后,您还有一个ViewModel,这是视图将使用的。您已经定义了实体数据模型,即查看如何通过DbContext访问主模型。这意味着实体框架希望此对象具有为ViewModels定义的键,通常没有数据库关联。请在viewmodel中发布一个id示例。从您的帖子中可以看出,您指定了一个EntitySet类型MainModels,如果你想这样做,你需要指定一个键或某种id。MainModel类中的键?我在SO中浏览了几个线程,只看到它们在主模型中声明模型类。我是mvc3 noob。MVC中通常使用两种类型,模型通常指的是at从数据库获取数据,或者它可能是您的域模型。然后,您还有一个ViewModel,这是您的视图将使用的。您定义了一个实体数据模型,即通过DbContext查看如何访问主模型。这意味着实体框架希望此对象具有为ViewModels定义的键,通常没有数据库关联。请在viewmodel中发布id的示例好吗?谢谢。如果viewmodel使用两个具有一对多关系(如个人订单)的数据模型,效果如何?我终于利用您的一些想法得到了我的列表。我将发布我的答案。谢谢。使用两个数据的viewmodel如何具有一对多关系的模型,如个人订单?我终于用你的一些想法得到了我的列表。我将发布我的答案。
    @{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>