我正在开发一个使用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"/>
请提供代码。 –
附加代码。抱歉应该早点完成。 – MVCNinja