глобальные переменные asp.net mvc5 для всех представлений

У меня есть URL-адреса fb, twitter и youtube в БД и около 30 других переменных уровня приложения.

в настоящее время я запрашиваю его в каждом действии bcz в шаблоне. У меня есть социальные ссылки в нижнем колонтитуле, если пропустить, это вызовет ошибку.

ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.group).ThenBy(s => s.sort).ToList();

Я хочу, чтобы строка выше выполнялась для всех действий где-то в глобальном масштабе. Погуглил, многие люди предлагают вставить сеанс, но я думаю, что это не должно быть в переменных сеанса, так как его размер может быть длинным.

Все мои контроллеры унаследованы от Controller как

открытый класс HomeController : Контроллер {}

пожалуйста помоги.

ОБНОВЛЕНИЕ Я создал конструктор в домашнем контроллере, как показано ниже.

public HomeController()
    {
        if (ViewBag.Contents == null)
        {
            ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
        }
    }

это уменьшило вызов его в каждом действии, но все же я должен вводить одно и то же во всех контроллерах. Это нормально или нет? и как мы можем написать это глобально для всех контроллеров


person Community    schedule 03.09.2018    source источник
comment
Прекратите использовать ViewBag и создайте метод контроллера [ChildActionOnly], который возвращает частичное представление вашего нижнего колонтитула на основе IEnumerable<Contents>, а затем вы можете просто использовать @Html.Action(...), чтобы добавить это частичное представление в свой макет.   -  person    schedule 03.09.2018


Ответы (1)


Если вы должны сделать это таким образом, просто создайте базовый контроллер для вашего приложения.

public class BaseController : Controller
{
     public BaseController() 
     {
        if (ViewBag.Contents == null)
        {
            ViewBag.Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
        }
     }
}
public class HomeController : BaseController {

}

Однако я бы не рекомендовал использовать ViewBag. Его динамическая природа означает, что у вас нет уверенности во времени компиляции. Лучший способ — использовать строго типизированную ViewModel для каждого представления. Если у вас есть данные, которые вам нужны на всех страницах, вы можете просто использовать базовую модель представления.

public class BaseViewModel
{
     public List<object> Contents { get; }
     public BaseViewModel() 
     {
        if (Contents == null)
        {
            Contents = db.Contents.Where(s => s.status == 1).OrderBy(s => s.sort).ToList();
        }
     }
}
public class ViewModel: BaseViewModel {

}

Использование:

Поместите это в верхнюю часть вашего представления:

@model ViewModel

Затем вы можете получить доступ к содержимому, используя синтаксис Razor:

@Model.Contents
person Jacob    schedule 03.09.2018