Je n'ai pas essayé, mais vous pouvez envisager d' enregistrer vos vues , puis de définir les données de vue pendant le processus d'activation.
Étant donné que les vues sont enregistrées à la volée, la syntaxe d'enregistrement ne vous aide pas à vous connecter à l' Activated
événement, vous devez donc le configurer dans un 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";
};
}
}
}
Cela pourrait être une de ces suggestions de type "seul outil est un marteau" de ma part; il peut y avoir des moyens plus simples activés par MVC pour y parvenir.
Edit: Autre approche, moins de code - il suffit de l'attacher au contrôleur
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>();
};
}
}
}
Edit 2: Une autre approche qui fonctionne directement à partir du code d'enregistrement du contrôleur:
builder.RegisterControllers(asm)
.OnActivated(e => {
dynamic viewBag = ((Controller)e.Instance).ViewBag;
viewBag.Config = e.Context.Resolve<Config>();
viewBag.Identity = e.Context.Resolve<IIdentity>();
});
Nicholas Blumhardt
la source
Resolve
partie dee.Context.Resolve
? Je devrais mentionner que je suis habitué à Ninject ...Le meilleur moyen consiste à utiliser ActionFilterAttribute et à enregistrer votre classe personnalisée dans votre fichier global. asax (Application_Start)
enregistrez votre classe personnalisée dans votre global. asax (Application_Start)
Ensuite, vous pouvez l'utiliser dans toutes les vues
Il y a aussi une autre façon
Création d'une méthode d'extension sur HtmlHelper
Ensuite, vous pouvez l'utiliser dans toutes les vues
la source
MembershipService
?Étant donné que les propriétés ViewBag sont, par définition, liées à la présentation de la vue et à toute logique de vue légère qui peut être nécessaire, je créerais une WebViewPage de base et définirais les propriétés lors de l'initialisation de la page. C'est très similaire au concept d'un contrôleur de base pour une logique répétée et des fonctionnalités communes, mais pour vos vues:
Et puis dans
\Views\Web.config
, définissez lapageBaseType
propriété:la source
ViewBag.Title
propriété, puis la seule chose dans la mise en page partagée est<title>@ViewBag.Title</title>
. Cela ne serait pas vraiment approprié pour quelque chose comme une page de vue d'application de base, car chaque vue est distincte et la page de vue de base serait pour des données qui sont vraiment communes à toutes les vues.Le message de Brandon est juste sur l'argent. En fait, je voudrais aller plus loin et dire que vous devez simplement ajouter vos objets communs comme propriétés de la WebViewPage de base afin que vous n'ayez pas à lancer des éléments du ViewBag dans chaque vue. Je fais ma configuration CurrentUser de cette façon.
la source
'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?)
Vous pouvez utiliser un ActionResult personnalisé:
Ou même un ActionFilter:
Avait un projet MVC 2 ouvert mais les deux techniques s'appliquent toujours avec des modifications mineures.
la source
Vous n'avez pas à vous soucier des actions ou à modifier le modèle, utilisez simplement un contrôleur de base et lancez le contrôleur existant à partir du contexte de la vue de disposition.
Créez un contrôleur de base avec les données communes souhaitées (titre / page / emplacement, etc.) et l'initialisation de l'action ...
Assurez-vous que chaque contrôleur utilise le contrôleur de base ...
Diffusez le contrôleur de base existant à partir du contexte de vue de votre
_Layout.cshml
page ...Vous pouvez maintenant vous référer aux valeurs de votre contrôleur de base à partir de votre page de mise en page.
la source
Si vous voulez vérifier le temps de compilation et intellisense pour les propriétés de vos vues, le ViewBag n'est pas la voie à suivre.
Considérez une classe BaseViewModel et faites hériter vos autres modèles de vue de cette classe, par exemple:
Vue de base
Afficher un ViewModel spécifique
Le code de vue peut maintenant accéder à la propriété directement dans la vue
la source
J'ai trouvé que l'approche suivante est la plus efficace et donne un excellent contrôle en utilisant le fichier _ViewStart.chtml et des instructions conditionnelles si nécessaire:
_ ViewStart :
VueA :
Remarque :
la source