Não experimentado por mim, mas você pode tentar registrar suas visualizações e, em seguida, definir os dados de visualização durante o processo de ativação.
Como as visualizações são registradas instantaneamente, a sintaxe de registro não ajuda você a se conectar ao Activated
evento, então você precisa configurá-la em 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";
};
}
}
}
Esta pode ser uma daquelas sugestões do tipo "única ferramenta é um martelo"; pode haver maneiras mais simples habilitadas para MVC de fazer isso.
Editar: alternativa, abordagem menos código - basta anexar ao controlador
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>();
};
}
}
}
Edição 2: Outra abordagem que funciona diretamente a partir do código de registro do controlador:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Resolve
partee.Context.Resolve
? Devo mencionar que estou acostumado com Ninject ...A melhor maneira é usar ActionFilterAttribute e registrar sua classe customizada em seu global. asax (Application_Start)
registre sua classe customizada em seu global. asax (Application_Start)
Então você pode usá-lo em todas as visualizações
Também há outra maneira
Criação de um método de extensão em HtmlHelper
Então você pode usá-lo em todas as visualizações
fonte
MembershipService
?Como as propriedades do ViewBag são, por definição, vinculadas à apresentação da visualização e a qualquer lógica de visualização de luz que possa ser necessária, eu criaria uma WebViewPage base e definiria as propriedades na inicialização da página. É muito semelhante ao conceito de um controlador de base para lógica repetida e funcionalidade comum, mas para suas visualizações:
Em seguida
\Views\Web.config
, defina apageBaseType
propriedade:fonte
ViewBag.Title
propriedade e então a única coisa no layout compartilhado é<title>@ViewBag.Title</title>
. Não seria realmente apropriado para algo como uma página de visualização de aplicativo base, pois cada visualização é distinta, e a página de visualização básica seria para dados que são verdadeiramente comuns em todas as visualizações.A postagem de Brandon está certa sobre o dinheiro. Na verdade, eu levaria isso um passo adiante e diria que você deve apenas adicionar seus objetos comuns como propriedades da WebViewPage base para que você não precise lançar itens do ViewBag em cada View. Eu faço minha configuração do CurrentUser desta forma.
fonte
'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?)
Você pode usar um ActionResult personalizado:
Ou mesmo um ActionFilter:
Tinha um projeto MVC 2 aberto, mas ambas as técnicas ainda se aplicam com pequenas alterações.
fonte
Você não precisa mexer com as ações ou alterar o modelo, apenas use um controlador de base e lance o controlador existente a partir do contexto de visualização do layout.
Crie um controlador de base com os dados comuns desejados (título / página / localização etc) e inicialização de ação ...
Certifique-se de que cada controlador usa o controlador de base ...
Transmita o controlador de base existente do contexto de visualização em sua
_Layout.cshml
página ...Agora você pode consultar os valores em seu controlador de base na página de layout.
fonte
Se você deseja compilar a verificação do tempo e o intellisense para as propriedades em suas visualizações, o ViewBag não é o caminho certo.
Considere uma classe BaseViewModel e faça com que seus outros modelos de visualização herdem desta classe, por exemplo:
ViewModel base
Ver ViewModel específico
Agora o código de visualização pode acessar a propriedade diretamente na visualização
fonte
Eu descobri que a seguinte abordagem é a mais eficiente e oferece excelente controle utilizando o arquivo _ViewStart.chtml e instruções condicionais quando necessário:
_ ViewStart :
ViewA :
Nota :
fonte