如何在一个视图中使用两个IENumerable模型

 明天会更好--好过_652 发布于 2023-02-06 11:38

我试图在一个视图中使用两个模型,但从我的理解我的程序只是在模型中看不到任何对象.

这是我的代码.

楷模:

    public class Album
    {
        [Key]
        public int ThreadId { get; set; } 
        public int GenreId { get; set; }
        public string Title { get; set; }
        public string ThreadByUser { get; set; } 
        public string ThreadCreationDate { get; set; }
        public string ThreadContent { get; set; } 
        public Genre Genre { get; set; }
        public List Posty { get; set; }
    }
    public class Posts 
    {
        [Key]
        public int PostId { get; set; }
        public int ThreadId { get; set; } 
        public string PostTitle { get; set; }
        public string PostContent { get; set; }
        public string PostDate { get; set; }
        public string PosterName { get; set; }
        public Album Album { get; set; }

    }

    public class ModelMix
    {
        public IEnumerable PostsObject { get; set; }
        public IEnumerable ThreadsObject { get; set; }
    }  

索引控制器代码:

    public ActionResult Index(int id)
    {

        ViewBag.ThreadId = id;
        var posts = db.Posts.Include(p => p.Album).ToList();
        var albums = db.Albums.Include(a => a.Genre).ToList();

        var mixmodel = new ModelMix
        {
            PostsObject = posts,
            ThreadsObject = albums
        };

        return View(mixmodel);
    }

查看代码:

@model MvcMusicStore.Models.ModelMix

Index

@Html.DisplayNameFor(model => model.PostsObject.PostContent)

当我尝试执行我的程序时,我收到此错误:

CS1061:"System.Collections.Generic.IEnumerable"不包含"PostContent"的定义,未找到扩展"PostContent"的方法,该方法采用类型为"System.Collections.Generic.IEnumerable"的第一个参数.

我怎样才能让它按预期工作?在互联网上有很多像我这样的问题,但我找不到任何匹配我的情况.

1 个回答
  • 在MVC中循环使用模型可能会有点混乱,只是因为模板化帮助程序(即Html.DisplayForHtml.EditorFor)可以提供模板,帮助程序将自动为集合中的每个元素调用这些模板.这意味着如果你是MVC的新手,并且你没有意识到已经DisplayTemplate或者EditorTemplate没有为该集合提供过,那么它看起来很简单:

    @Html.DisplayFor(m => m.SomePropertyThatHoldsACollection)
    

    是你所需要的全部.因此,如果您已经看过类似的东西,这可能就是您做出假设的原因.但是,让我们暂时假设还没有提供模板.你有两个选择.

    首先,最简单的说,就是使用foreach集合:

    @foreach (var post in Model.PostsObject)
    {
        @Html.DisplayFor(m => post.PostTitle)
        // display other properties
    }
    

    你也可以使用一个for循环,但是IEnumerable<T>,没有索引器,所以这不起作用:

    @for (int i = 0; i < Model.PostsObject.Count(); i++)
    {
        // This generates a compile-time error because
        // the index post[i] does not exist.
        // This syntax would work for a List<T> though.
        @Html.DisplayFor(m => post[i].PostTitle)
        // display other properties
    }
    

    如果你确实想要使用for循环,你可以像这样使用它:

    @for (int i = 0; i < Model.PostsObject.Count(); i++)
    {
        // This works correctly
        @Html.DisplayFor(m => post.ElementAt(i).PostTitle)
        // display other properties
    }
    

    因此,请根据您的喜好使用.但是,在某些时候,考虑为您的类型提供模板是一个好主意.(注意:尽管本文是针对MVC 2编写的,但该建议仍然适用.)它们允许您从视图中删除循环逻辑,使其更清晰.当与Html.DisplayFor,或Html.EditorFor它们结合使用时,它们也会为模型绑定生成正确的元素命名(这很棒).它们还允许您重用类型的表示.

    我要做的最后一个评论是你的属性的命名有点冗长:

    public class ModelMix
    {
        public IEnumerable<Posts> PostsObject { get; set; }
        public IEnumerable<Album> ThreadsObject { get; set; }
    }
    

    我们已经知道它们是对象,所以最后不需要添加它.这更具可读性:

    public class ModelMix
    {
        public IEnumerable<Posts> Posts { get; set; }
        public IEnumerable<Album> Threads { get; set; }
    }
    

    2023-02-06 11:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有