На мой взгляд, ViewData
(и его родственники, такие как ViewBag, Model и т. Д.) Предназначены для конкретного текущего представления .Ваш _Layout.cshtml не относится к текущему представлению;и было бы неловко, если бы КАЖДОМУ контроллеру пришлось бы передавать данные категорий в дополнение к любым другим данным, которые ему нужно передать для представления.
Вместо этого я предоставляю статический метод в одном из моихвспомогательные классы, которые извлекают категории из БД.Я также выполняю там некоторое кэширование, чтобы мне не приходилось обращаться к БД при каждом отдельном запросе.Затем _Layout.cshtml просто вызывает этот статический метод.Просто и элегантно.
Если хотите, вы можете вывести это на частичный вид, сделать его вспомогательным методом, что угодно.
Хотя одно замечание: мой пользовательский вид ошибок также используеттот же _Layout.cshtml, и если БД отключается, вы получаете исключение, пытаясь отобразить исключение.ASP.NET MVC достаточно умен, чтобы обнаружить это и прервать обработку, но у вас осталась неописуемая страница ошибок по умолчанию.Что я сделал, так это разместил операторы try...catch
вокруг этих опасных вызовов, которые тихо игнорируют исключение, если текущая страница является представлением ошибок.