2017-09-01 3 views
0

J'utilise ce code pour déterminer si ma page est actualisée mais il est toujours revenir comme vraiActualiser détecter filtre est toujours vrai

public class RefreshDetectFilter : ActionFilterAttribute, IActionFilter 
{ 
    //void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var cookie = filterContext.HttpContext.Request.Cookies["RefreshFilter"]; 
     filterContext.RouteData.Values["IsRefreshed"] = cookie != null && 
                  cookie.Value == filterContext.HttpContext.Request.Url.ToString(); 
    } 

    //void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext) 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.SetCookie(new HttpCookie("RefreshFilter", filterContext.HttpContext.Request.Url.ToString())); 
    } 
} 

dans mon contrôleur je l'attribut et la vérification

[RefreshDetectFilter] 
public class UserController : Controller 

dans la méthode d'action

if (Convert.ToBoolean(RouteData.Values["IsRefreshed"]) == true) 
{ 
    // page has been refreshed. 
} 

Répondre

0

Je suppose que vous ne définissez pas assez tôt le cookie dans la demande pour que cela ait un effet. Pour MSDN:

Vous devez créer des cookies avant que la page ASP.NET ne soit rendue au client. Par exemple, vous pouvez écrire un cookie dans un gestionnaire d'événements Page_Load mais pas dans un gestionnaire d'événement Page_Unload. Pour plus d'informations sur le cycle de vie de la page, voir ASP.NET Page Life Cycle Overview.

Bien que, si vous regardez le MVC life cycle overview, les événements de filtre d'action ne concordent pas vraiment avec les événements de page ASP.NET il est donc difficile de dire sans une certaine expérimentation. Cela dit, je pense que vous devez faire:

public class RefreshDetectFilter : ActionFilterAttribute, IActionFilter 
{ 
    //void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var cookie = filterContext.HttpContext.Request.Cookies["RefreshFilter"]; 
     filterContext.RouteData.Values["IsRefreshed"] = cookie != null && 
                 cookie.Value == filterContext.HttpContext.Request.Url.ToString(); 

     filterContext.HttpContext.Response.SetCookie(new HttpCookie("RefreshFilter", filterContext.HttpContext.Request.Url.ToString())); 
    } 
} 

REMARQUE: Si vous définissez une valeur d'itinéraire de cette façon, il finira comme paramètre de chaîne de requête de chaque URL qui est généré sur la vue . Il est difficile de dire si c'est votre intention ou un effet secondaire indésirable.