Ядро Asp.net Несколько запросов к таблице в представлении? - PullRequest
0 голосов
/ 13 сентября 2018

Я работаю над проектом Asp.net Core 2.Есть много частей в моем index.cshtml.Пожалуйста, смотрите картинку ниже.

enter image description here

Также у меня есть таблица с именем News_Tbl, которую все новости вставляют в эту таблицу (News_Tbl содержит NewsId, NewsTitle, NewsContent, NewsType).

Значение типа новости:

1 = Новости спорта

2 = Последние новости

3 = Экономические новости

4 = Новости здравоохранения

5 = Зарубежные новости

Кроме того, каждый раздел в представлении index.cshtml имеет вид PartialView,Как вы видите, мне нужно несколько запросов на News_Tbl запрос.

Мой запрос в index Действие

    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.Я хочу знать, есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Использовать Просмотр компонентов . Создайте в своем проекте новую папку с именем 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 })
0 голосов
/ 13 сентября 2018

Вы можете сделать это следующим образом -

Создайте пользовательскую модель, скажем, 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...