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

У меня есть 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: Controller {}

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

UPDATE Я создал конструктор в домашнем контроллере, как показано ниже

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

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

1 Ответ

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

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

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 для каждого View. Если у вас есть необходимые данные по всем страницам, вы можете просто использовать модель базового вида.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...