2010-04-05 5 views
0

J'ai un scénario unique dans lequel je souhaite qu'un contrôleur de base saisisse des données et les stocke dans une liste. La liste doit être accessible depuis mes vues, tout comme ViewData. J'utiliserai cette liste sur chaque page et je voudrais une solution plus propre que de simplement l'insérer dans le ViewDataDictionary. Après avoir tenté de trouver une solution, j'ai pensé créer une ViewPage personnalisée avec une propriété pour contenir ma liste. Mon ViewPage personnalisé hériterait de System.Web.MVC.ViewPage. Cependant, je ne sais pas où MVC passe les viewdata du contrôleur à la vue. Plus important encore, comment puis-je faire passer ma liste à la vue?ASP.NET MVC transmet les informations du contrôleur à afficher SANS ViewData, ViewModel ou Session

Merci pour l'aide.

EDIT ....

Désolé pour la confusion. J'essayais de garder la question aussi simple que possible pour éviter toute confusion. Évidemment, cela n'a pas fonctionné :)

J'applique ma propre gestion de session dans un projet .net mvc. Quand une requête arrive, mon contrôleur de base vérifie si un cookie de session a été envoyé avec la requête dans la méthode OnActionExecuting. Si un cookie de session a été envoyé, mon contrôleur frappe la base de données et récupère les informations de session de l'utilisateur. Les informations de session (userid, etc ..) sont placées dans un objet List et stockées dans une propriété appelée "Sess".

Je veux être en mesure d'accéder à des éléments dans la liste sess de mon point de vue comme celui-ci:

Alors, comment et où puis-je obtenir mon contrôleur à la main de la liste sess à mon point de vue? Je réalise que ce n'est pas la façon dont la gestion de session personnalisée est généralement implémentée dans .net. Cependant, ce serait la solution la plus simple et la plus propre pour mon projet.

Merci à tous ceux qui ont aidé jusqu'ici!

+1

Ceci est l'un de ces scénarios qui ressemblent à RenderAction peut être mieux adapté pour le travail. S'il y a des données qui doivent être rendues sur chaque page (comme un menu), RenderAction rend cela beaucoup plus facile. Il s'agit simplement d'un moyen simple de parcourir le cycle de vie afin de pouvoir partager des parties de votre application partagées (menus, publicités, widgets) – Jab

+0

Je suis d'accord avec Jab, rendez-vous avec RenderAction si vous avez besoin de données dynamiques. sorti de la banque de données ou aller avec RenderPartial si vous voulez juste rendre un ASCX (vous pouvez aussi éventuellement fournir un Modèle à RenderPartial si vous le souhaitez) – mare

Répondre

0

Pourquoi ne voulez-vous pas utiliser ViewData? Est-ce juste parce que vous ne voulez pas avoir une ligne de code dans chaque action qui place des données dans ViewDataDictionary?

Vous pouvez utiliser un filtre d'action et de mettre ces données avant chaque action exécute, comme par exemple

public class AddSomeDataToViewDataAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //filterContext.Controller.ViewData.Add("SomeConstant")(data); 
    } 
} 

Ensuite, vous venez de mettre cet attribut dans chaque contrôleur ou un contrôleur de base.

Edit: Vous pouvez faire deux ou trois méthodes d'extension comme

public static void Add<T>(this IDictionary<string, object> dictionary, T anObject) 
{ 
    var key = typeof(T).Name; 
    dictionary.Add(key, anObject); 
} 

public static T Get<T>(this IDictionary<string, object> dictionary) 
{ 
    var key = typeof(T).Name; 
    return (T)dictionary[key]; 
} 

Ensuite, vous ajoutez les données comme ceci:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //filterContext.Controller.ViewData.Add<YourListType>(data); 
} 

Et dans la vue, vous obtenez les données comme ceci:

ViewData.Get<YourListType>(); 

Cordialement.

+0

Je ne veux pas avoir à lancer ViewData ["Session"] sous la forme d'une liste temps dans mes vues. – josh

+0

Ok, j'ai édité ma réponse. – uvita

0

Question non claire: Pour répondre à une partie de celle-ci, vous pouvez utiliser une propriété sur un ViewModel de base. Vous devez définir cette propriété dans le constructeur de ViewModel de base.Vos objets d'instance doivent appeler explicitement le constructeur du ViewModel de base si des valeurs doivent lui être transmises quel que soit le travail effectué ... Cet appel de constructeur est tout C# normal, il y a donc beaucoup d'exemples sur le web.

Je suis d'accord que si c'est pour les menus, RenderAction semble être un moyen beaucoup plus facile d'implémenter la fonctionnalité. J'ai essayé la méthode ViewModel de base pour les menus, puis j'ai basculé vers l'utilisation de RenderAction sur un contrôleur qui est spécifiquement responsable de la navigation.

L'absence d'exemples de navigation dynamique pour les sites ASP.NET MVC est surprenante car elle semble être une exigence de base.

0

Vous devez mieux décrire votre problème.

Et, bien, à l'exception du filtre d'action ou du remplacement Controller.OnActionExecuted, vous pouvez utiliser Html.RenderAction.

2

En général, je vous recommande d'être explicite sur ce à quoi vos vues sont autorisées à accéder. Je vous recommande donc de placer ces données dans ViewData à partir de votre contrôleur, puis de les extraire de ViewData à partir de la vue. Cela maintient la ligne de communication entre votre contrôleur et la vue dans un endroit et simple. Toutefois, si vous voulez vraiment accéder à la session à partir de la vue, vous pouvez le faire.

<%: ViewContext.HttpContext.Session["key"] %> 

Une chose que vous pouvez faire est d'avoir votre propre classe de page vue personnalisée qui dérive de System.Web.Mvc.ViewPage et de modifier la déclaration Hérite en haut de la page pour pointer vers votre page d'affichage.

<%@ Page ... Inherits="YourNamespace.YourViewPage" %> 

Votre page de vue personnalisée peut avoir toutes les propriétés dont vous avez besoin.