我正在开发Asp.net Core 2项目。我的index.cshtml
有很多部分。请看下面的图片。
此外,我有一个名为News_Tbl
的表,所有新闻插入此表(News_Tbl
包含NewsId
,NewsTitle
,NewsContent
,NewsType
)。
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
。我想知道有更好的方法吗?
你可以这样做 -
创建一个自定义模型,说NewsModel
,它接受你通过控制器传递的列表。我假设_context.News_Tbl
是IQueryable
类型。您可以根据自己的需要进行更改。
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一样。
使用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 })