Les variables de Session dans l'action du filtre
J'ai une action de filtre vérifie si une variable de session ID
est réglé. À des fins de développement, j'ai manuellement définir cette variable avant de la vérification.
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Session.Add("ID", 123123);
int ID = (int)context.HttpContext.Session.Contents["ID"];
var rd = context.HttpContext.Request.RequestContext.RouteData;
TED _db = new TED();
//if not in DB
if (_db.Users.Find(ID) == null && rd.GetRequiredString("action") != "NoAccess")
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "NoAccess");
redirectTargetDictionary.Add("controller", "Home");
redirectTargetDictionary.Add("area", "");
context.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
base.OnActionExecuted(context);
}
}
Comme je le comprends, ce code est exécuté avant toute la page, ce Session["ID"]
est toujours ensemble. Le site fonctionne très bien si je reçois constamment des tests, mais il semble se briser si je le laisse pour un moment, puis essayez de poursuivre les essais. Voici l'erreur que je reçois:
int UserID = (int)Session.Contents["ID"];
System.NullReferenceException: Object reference not set to an instance of an object.
J'ai d'abord pensé à la session peuvent tout simplement échus, mais avant tout chargement de la page, Session["ID"]
doit être configuré. Quel est le problème ici?
"mais avant tout chargement de la page, la Session["ID"] doit être configuré"--pourquoi ne pas vous fixer un point d'arrêt et de trouver pour vous
OriginalL'auteur Jeff | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
vous êtes à la mise en œuvre de votre actionfilter sur
OnActionExecuted
méthode qui s'exécute APRÈS votre méthode d'actionVous devez mettre en œuvre la
OnActionExecuting
méthodeDoh! C'est la plus petite des choses que vous obtenez parfois... Aussi, j'ai édité votre réponse à modifier ces lignes:
public override void OnActionExecuting(ActionExecutedContext context)
base.OnActionExecuted(context);
- À-direExecuting
aussitoujours les petits détails qui tuent! les grands sont faciles à trouver.
Ce code n'a même pas compiler! La signature de la méthode est mauvaise.
Je suppose que vous avez manqué le point de ma réponse. Je n'ai pas vraiment d'analyser OP du code. J'ai simplement souligné le rôle que j'ai est clairement faux. J'ai supposé que le reste a fonctionné. La signature et la compilation n'a rien à voir avec l'OP en utilisant le mauvais remplacer.
OriginalL'auteur Dave Alperovich