2012-12-06 51 views
1

我正在开发一个使用ASP.NET MVC3和Razor语法的简单测试网站。它有_LayoutPage.cshtml作为主模板,它使用@HTML.Action在每个页面的站点顶部打印用户标识。ASP.NET MVC会话变量通过HTML.Action变为空ChildAction

我实现了childAction这个部分视图名为userInfo,它从HTTPContext.Session中读取用户标识并将其打印出来。儿童行为在Controller派生的名为CommonActionController的控制器中执行。除了用户ID之外,它还从会话中读取两个变量并打印它。所谓HomeController

public class CommonActionController: Controller 
{ 

    [ChildActionOnly] 
    public ActionResult userInfo() 
    { 

     if(HTTPContext.Session["x-user-id"] != null) 
     { 
      ViewBag.UserId = (string)(HTTPContext.Session["x-user-id"]); 
      ViewBag.UserFirstName = (string)(HTTPContext.Session["x-user-first-name"]); 
      ViewBag.UserLastName = (string)(HTTPContext.Session["x-user-last-name"]); 
      ViewBag.UserLoggedinSince = (DateTime)(HTTPContext.Session["x-user-logon-timestamp"]).ToString("f"); 
     } 

     return PartialView(); 
    } 
} 

我的主网页控制器具有Dashboard行动(目前只是打印单词“仪表板”)实现的仪表板功能。在此控制器中,我重写了Controller.OnActionExecuting()方法,该方法验证用户标识是否存在于会话中。它像前面提到的childAction一样从会话中读取总共三个变量。

public class HomeController: Controller 
{ 


    public HomeController() 
    { 

    } 


    protected override void OnActionExecuting(ActionExecutingContext ctx) 
    { 


     base.OnActionExecuting(ctx); 

     if(HTTPContext.Session["x-user-id"] == null) 
      ctx.Result = new RedirectResult("logon/userlogon"); 

     if(HTTPContext.Session["x-user-logon-timestamp"] == null) 
      ctx.Result = new RedirectResult("logon/userlogon"); 

     if(HTTPContext.Session["x-user-internal-flag"] == null) 
      ctx.Result = new RedirectResult("logon/userlogon"); 

    } 

    public ActionResult Dashboard() 
    { 
     // nothing to see here 
     return View(); 
    } 

} 

我已经清理了一点代码来删除debug.print语句。

根据日志我看到OnActionExecuting()方法和userInfo子动作是同时调用的。在一点OnActionExecuting()获得会话变量的空值。在日志中我可以看到,直到ChildAction被调用,会话变量保持其值在OnActionExecuting()之内。一旦childaction访问它们,它们就会变为空。

当我评论从子动作访问会话的代码时,一切正常。我究竟做错了什么?访问会话变量时是否需要采取一些预防措施?这是由于我不知道如何异步访问会话吗?

我也有我的web.config如下:

<modules runAllManagedModulesForAllRequests="true"/> 
+0

请提供代码。 –

+0

附加代码。抱歉应该早点完成。 – MVCNinja

回答