2009-12-03 254 views
1

我想知道是否有人可以帮忙,我想为当前页面上的当前用户保存一个全局变量,我认为Sessions在mvc中不好?ASP.NET MVC:保存状态?使用会话?

我应该举一个我在做什么的例子。基本上我有一个控制器和它进入(动作=索引)和i检查

Request.UrlReferrer 

而如果它包含一个值,该值表示它从另一个地方即谷歌例如到达。我将这些信息写入日志。现在在控制器的这个阶段一切都很好。

但后来在我的网页我想回顾在控制器的方法(使用jQuery和Ajax)来处理一些跟踪,但记住我仍然在同一个页面中,我使用

Request.UrlReferrer 

,但在这个阶段它始终是页面的名称,因为引用者是启动ajax调用和“不”谷歌的页面。好吧,看来我需要将值或UrlReferrer保存到全局变量/每个用户,以便当我重新进入我的控制器时,我可以检查这个SAVED变量而不是Request.UrlReferrer。

有没有人知道最简单的方法来做到这一点?

这里是我的网页

public ActionResult Index() 
    { 
     // Process tracking - Initial entry 
     string ip = Request.UserHostAddress.ToString(); 
     string referrer = null; 

     if (Request.UrlReferrer !=null) 
      referrer = Request.UrlReferrer.ToString(); 

     // WRITE THE LOGS HERE!!!! 

     return View(); 
    } 

    public ActionResult ProcessTracking() 
    { 
     // Reprocess tracking 
     // BUt can't use Request.UrlReferrer as it returns my calling page and not google 
     // for example 




     //string ip = Request.UserHostAddress.ToString(); 
     //string referrer = null; 

     //if (Request.UrlReferrer != null) 
     // referrer = Request.UrlReferrer.ToString(); 

     //return View(); 
    } 

回答

4

您应该将值存储在TempData中。 TempData的全部用途是在控制器调用之间保存信息。从MVC 2 Beta版开始,值将一直保持在此位置直到它被读取。

public ActionResult Index() 
{   
// Process tracking - Initial entry   
string ip = Request.UserHostAddress.ToString();   
string referrer = null;   
if (Request.UrlReferrer !=null)    
referrer = Request.UrlReferrer.ToString(); 
TempData["referrer"] = referrer; 
// WRITE THE LOGS HERE!!!!   
return View();  
}  

public ActionResult ProcessTracking()  
{   
// Reprocess tracking   
// BUt can't use Request.UrlReferrer as it returns my calling page and not google   
// for example   
string ip = Request.UserHostAddress.ToString();   
string referrer = TempData["referrer"];   
//continue processing here 
return View();  
} 
+0

谢谢,是的,这看起来正是我想要的!我只是测试它,它似乎工作,但我有一个问题。它是否留在那里,直到我在ASPNET MVC 1.0中读取它?或不? ..我假设它不是一个全局变量,因此,如果我有2个用户变量不会覆盖另一个? – 2009-12-03 16:28:58

+0

TempData的范围在请求的上下文中,因此它不会被同时用户覆盖。在MVC 1.0中,TempData将在下一次控制器调用时被清除。这意味着如果有一个控制器操作被调用(包括ajax调用),数据将只能在VERY NEXT调用中使用。如果您需要更多呼叫的数据,则需要让每个操作“触摸”数据: TempData [“referrer”] = TempData [“referrer”]; 有点哈克?是的,但MVC团队已经修复了MVC 2的问题,所以它会变得更好! – 2009-12-03 16:34:35

+0

哇杰夫,谢谢..只是想我需要! – 2009-12-03 16:37:51

0

这是确定使用会话包存储Request.UrlReferrer的第一个值的一个例子。但是就像在WebForms中一样,确保在会话变量未使用时删除会话变量。此持久性的另一个选项可以是Cookie或MVC 1.0中的ASP.NET MVC TempData包只能在重定向到另一个页面之前使用,并且在MVC 2.0 Beta中时只有在读取时才会清除TempData(或者会话过期时) 。

Lucas Oleiro