Я не пробовал, но вы можете зарегистрировать свои представления, а затем установить данные представления во время процесса активации.
Поскольку представления регистрируются на лету, синтаксис регистрации не поможет вам подключиться к Activated
событию, поэтому вам нужно будет настроить его в Module
:
class SetViewBagItemsModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistration registration,
IComponentRegistry registry)
{
if (typeof(WebViewPage).IsAssignableFrom(registration.Activator.LimitType))
{
registration.Activated += (s, e) => {
((WebViewPage)e.Instance).ViewBag.Global = "global";
};
}
}
}
Это может быть одно из моих предложений типа «единственный инструмент - молоток»; могут быть более простые способы с поддержкой MVC.
Изменить: альтернативный подход с меньшим количеством кода - просто прикрепите к контроллеру
public class SetViewBagItemsModule: Module
{
protected override void AttachToComponentRegistration(IComponentRegistry cr,
IComponentRegistration reg)
{
Type limitType = reg.Activator.LimitType;
if (typeof(Controller).IsAssignableFrom(limitType))
{
registration.Activated += (s, e) =>
{
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
};
}
}
}
Изменить 2: Другой подход, который работает непосредственно с регистрационным кодом контроллера:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Resolve
частьe.Context.Resolve
? Я должен упомянуть, что привык к Ninject ...Лучший способ - использовать ActionFilterAttribute. Я покажу вам, как использовать его в .Net Core и .Net Framework.
.Net Core 2.1 и 3.1
Затем вам нужно зарегистрировать это в своем startup.cs.
.Net Core 3.1
.Net Core 2.1
Затем вы можете использовать его во всех представлениях и страницах
.Net Framework (ASP.NET MVC .Net Framework).
зарегистрируйте свой собственный класс в файле global. asax (Application_Start)
Затем вы можете использовать его во всех представлениях
Также есть другой способ
Создание метода расширения в HtmlHelper
Затем вы можете использовать его во всех представлениях
источник
MembershipService
?Поскольку свойства ViewBag по определению связаны с представлением представления и любой необходимой логикой представления светлого изображения, я бы создал базовый WebViewPage и установил свойства при инициализации страницы. Это очень похоже на концепцию базового контроллера для повторяющейся логики и общих функций, но для ваших представлений:
А затем
\Views\Web.config
установитеpageBaseType
свойство:источник
ViewBag.Title
свойство, а затем единственное, что в общем макете<title>@ViewBag.Title</title>
. Это не совсем подходит для чего-то вроде базовой страницы представления приложения, поскольку каждое представление индивидуально, а страница базового представления будет предназначена для данных, которые действительно являются общими для всех представлений.Пост Брэндона идет прямо по деньгам. В самом деле, я бы этот шаг еще дальше и сказать , что вы должны просто добавить свои общие объекты как свойства в базовой WebViewPage , поэтому вам не придется литых деталей из ViewBag в каждом View. Я делаю настройку CurrentUser таким образом.
источник
'ASP._Page_Views_Shared__Layout_cshtml' does not contain a definition for 'MyProp' and no extension method 'MyProp' accepting a first argument of type 'ASP._Page_Views_Shared__Layout_cshtml' could be found (are you missing a using directive or an assembly reference?)
Вы можете использовать собственный ActionResult:
Или даже ActionFilter:
Был открыт проект MVC 2, но оба метода все еще применимы с небольшими изменениями.
источник
Вам не нужно возиться с действиями или изменять модель, просто используйте базовый контроллер и приведите существующий контроллер из контекста представления макета.
Создайте базовый контроллер с желаемыми общими данными (заголовок / страница / местоположение и т.д.) и инициализацией действия ...
Убедитесь, что каждый контроллер использует базовый контроллер ...
Отобразите существующий базовый контроллер из контекста представления на вашей
_Layout.cshml
странице ...Теперь вы можете ссылаться на значения в базовом контроллере со страницы макета.
источник
Если вам нужна проверка времени компиляции и intellisense для свойств в ваших представлениях, ViewBag - не лучший вариант.
Рассмотрим класс BaseViewModel и другие модели представления наследуются от этого класса, например:
Базовая модель просмотра
Просмотр конкретной ViewModel
Теперь код просмотра может получить доступ к свойству прямо в представлении
источник
Я считаю, что следующий подход является наиболее эффективным и дает отличный контроль, используя файл _ViewStart.chtml и при необходимости условные операторы:
_ ViewStart :
ViewA :
Примечание :
источник