ASP.NET MVC.一个视图中有来自同一存储库的多个结果
本文关键字:存储 结果 MVC NET 一个 ASP 视图 | 更新日期: 2023-09-27 18:26:19
我绝对是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();
}
p.S.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);
}
您可以通过使用匿名对象作为模型来返回这两个结果:
return View(new { top20, tag });
或者,如果你喜欢stronly类型的东西,你可以声明一个类来封装你的属性:
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
以及使用Model对象访问属性:
<ul>
@foreach(var post in Model.Top20) {
<li>@post.Title</li>
}
</ul>
请参阅本文以获得有关它的进一步解释(特别是"强类型模型和@model关键字"一章)。
您可以创建一个视图模型,在其中填充视图中显示所需的严格数据。您可以将每个DTO中的字段映射到视图模型中,并在视图中渲染这些字段。作为下一步,您也可以使用AutoMapper自动映射您的属性。
https://nerddinnerbook.s3.amazonaws.com/Part6.htm
http://jasona.wordpress.com/2010/02/05/getting-started-with-automapper/