Asp.net核心视图中的表上有多个查询?

问题描述 投票:1回答:2

我正在开发Asp.net Core 2项目。我的index.cshtml有很多部分。请看下面的图片。

enter image description here

此外,我有一个名为News_Tbl的表,所有新闻插入此表(News_Tbl包含NewsIdNewsTitleNewsContentNewsType)。

NewsType价值:

1 =体育新闻

2 =突发新闻

3 =经济新闻

4 =健康新闻

5 =外国新闻

此外,index.cshtml视图中的每个部分都是PartialView。如您所见,我需要对News_Tbl查询进行多次查询。

我在index Action中的查询

    public IActionResult Index()
    {

        ViewBag.SportNews = _context.News_Tbl.Select(n => n.NewsType == 1).Take(18).ToList();
        ViewBag.BrekingNews = _context.News_Tbl.Select(n => n.NewsType == 2).Take(8).ToList();
        ViewBag.EconomicNews = _context.News_Tbl.Select(n => n.NewsType == 3).Take(15).ToList();
        ViewBag.HealthNews = _context.News_Tbl.Select(n => n.NewsType == 4).Take(15).ToList();
        ViewBag.ForeignNews = _context.News_Tbl.Select(n => n.NewsType == 5).Take(8).ToList();


        return View();
    }

如您所见,为每个部分编写了一个查询,并通过ViewBag发送到index.cshtml。我想知道有更好的方法吗?

asp.net-mvc model-view-controller asp.net-core
2个回答
0
投票

你可以这样做 -

创建一个自定义模型,说NewsModel,它接受你通过控制器传递的列表。我假设_context.News_TblIQueryable类型。您可以根据自己的需要进行更改。

   public class NewsModel
   {
        public List<News_Tbl> SportsNews { get; set; }
        public List<News_Tbl> BrekingNews { get; set; }
        public List<News_Tbl> EconomicNews { get; set; }
        public List<News_Tbl> HealthNews { get; set; }
        public List<News_Tbl> ForeignNews { get; set; }

    public NewsModel(IQueryable<News_Tbl> list)
    {
        this.SportsNews = list.Where(n => n.NewsType == 1).Take(18).ToList();
        this.BrekingNews = list.Where(n => n.NewsType == 2).Take(8).ToList();
        this.EconomicNews = list.Where(n => n.NewsType == 3).Take(15).ToList();
        this.HealthNews = list.Where(n => n.NewsType == 4).Take(15).ToList();
        this.ForeignNews = list.Where(n => n.NewsType == 5).Take(8).ToList();
    }
}

用法

public IActionResult Index()
    {
      var model = new NewsModel(_context.News_Tbl);    
      return View(model);
    }

现在,您可以在视图中使用此列表,就像我们通常使用viewmodel一样。


0
投票

使用view components。在项目中创建一个名为ViewComponents的新文件夹。在里面添加一个像NewsViewComponent这样的类,如下所示:

public class NewsViewComponent : ViewComponent
{
    private readonly MyNewsService _service;

    public NewsViewComponent(MyNewsService service)
    {
        _service = service ?? throw new ArgumentNullException(nameof(service));
    }

    public async Task<IViewComponentResult> InvokeAsync(NewsType type)
    {
        // use `_service` to get news filtered by `type`
        return View(news);
    }
}

上面的MyNewsService只是一个占位符,用于显示如何将某些内容注入视图组件以检索新闻。将其替换为您实际需要使用的任何内容,上下文,某些API服务等。

然后,添加视图,Views\Shared\Components\News\Default.cshtml,并在里面添加渲染新闻文章列表所需的HTML代码。

最后,在您的主视图或布局中 - 无论您何时需要实际显示新闻文章列表 - 通过以下方式呈现每个区域:

@await Component.InvokeAsync("News", new { type = NewsType.SportsNews })
© www.soinside.com 2019 - 2024. All rights reserved.