【问题标题】:ASP.NET MVC. Multiple results from the same repository in one ViewASP.NET MVC。在一个视图中来自同一存储库的多个结果
【发布时间】:2014-10-12 12:17:33
【问题描述】:

我绝对是 ASP.NET MVC 的初学者。 这是我要为主(主页)页面做的事情:

  • 获取最近 20 篇博文。
  • 获取博客标签列表。

据我所知,在同一个视图中使用不同的模型是不可能的,所以我试图调用同一个存储库的不同方法,然后显示结果。但问题是 - 我不知道如何加入结果。 我应该创建新模型并传递给 View() 还是应该使用不同模型的局部视图? 这是控制器代码:

public ActionResult Index()
        {
            var top20 = PostRepository.GetLast20();
            var tag = PostRepository.GetTags();
            //How should I return to View() both top20 and tags?
            return View();
        }

附: ActionResult 索引包含错误的参数,所以我将其删除。 P.S.S.可能我应该展示我的存储库:

public class BlogPostRepository : IPostRepo, IDisposable
    {
        private BlogAspNet db;
        public BlogPostRepository(BlogAspNet db)
        {
            this.db = db;
        }
        public IQueryable<blog_post> GetAll()
        {
            return db.blog_post.AsQueryable();
        }
        public IQueryable<tags> GetTags()
        {
            return db.tags.AsQueryable();
        }
        public IQueryable<ShortPostInfo> GetLast20()
        {
            var last = from a in db.blog_post
                       orderby a.Posted descending
                       select new ShortPostInfo
                       {
                           PostID = a.ID,
                           PostSubject = a.Subject,
                           PostAuthor = (from x in db.users where x.ID == a.Author select x.Login).FirstOrDefault(),
                           PostCreated = a.Posted,
                           PostImage = a.PostAvatar !=null ? a.PostAvatar : "other image",
                           PostRating = a.Rating != null ? a.Rating : 0,
                           PostedTags = (from x in db.posted_tags 
                                             join y in db.tags on x.TagID equals y.ID
                                             where x.PostID == a.ID
                                             select y.TagName).ToList()
                       };
            return last.Take(20).AsQueryable();
        }

这是界面:

  public class ShortPostInfo
    {
        public int PostID { get; set; }
        public string PostSubject { get; set; }
        public DateTime? PostCreated { get; set; }
        public string PostImage { get; set; }
        public string PostAuthor { get; set; }
        public byte? PostRating { get; set; }
        public IList<string> PostedTags { get; set; }
    }
    public interface IPostRepo : IDisposable
    {
        IQueryable<blog_post> GetAll();
        IQueryable<tags> GetTags();
        IQueryable<ShortPostInfo> GetLast20();
        IQueryable<ShortPostInfo> GetPostByTag(int tagid);
        IQueryable<FullPostInfo> GetPostById(int id);
        void Add(blog_post item);
        void Update(blog_post item);
        void Remove(int id);
    }

【问题讨论】:

  • 无论如何,您都应该创建新的 ViewModel,如果您返回数据库对象,那么您做错了。

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您可以使用匿名对象作为模型返回这两个结果:

return View(new { top20, tag });

或者如果你更喜欢强类型的东西,你可以声明一个类来封装你的属性:

public IndexModel {
      public IEnumerable<Post> Top20 { get;set;}
      public IEnumerable<Tag> Tags { get;set;}
}

然后在您的索引操作中:

public ActionResult Index(ShortPostInfo m)
{
    var top20 = PostRepository.GetLast20();
    var tag = PostRepository.GetTags();
    return View(new IndexModel { Top20 = top20, Tags = tag });
}

最后,您可以在 Razor 视图中使用文件顶部的这个符号来访问您的模型:

@model IndexModel

并使用模型对象访问属性:

<ul>
     @foreach(var post in Model.Top20) {
         <li>@post.Title</li>
     }
</ul>      

请参阅此article 以获取有关它的进一步说明(尤其是“强类型模型和@model 关键字”一章)。

【讨论】:

  • 我应该怎么称呼它,比如说 View() 中的 IndexModel?
  • 编辑了我的答案以提供更多详细信息。你用 Razor 吗?
  • 是的,请。是的,我正在使用 Razor。
  • 我收到以下错误“System.Linq.IQueryable”不包含“Top20”的定义,并且没有扩展方法“Top20”接受“System”类型的第一个参数.Linq.IQueryable' 可以找到
  • 你能找到这个room吗?
【解决方案2】:

您可以创建一个视图模型,在其中填充在视图中显示所必需的数据。 您可以将每个 DTO 中的字段映射到您的视图模型中并在您的视图中呈现这些字段。 您还可以在下一步使用 AutoMapper 自动映射您的属性。

https://nerddinnerbook.s3.amazonaws.com/Part6.htm

http://jasona.wordpress.com/2010/02/05/getting-started-with-automapper/

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2014-08-15
    • 2021-08-04
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多